python - 对象可以检查分配给它的变量的名称吗?

标签 python

在 Python 中,有没有办法让一个对象的实例看到它分配给它的变量名?以下面的例子:

class MyObject(object):
    pass

x = MyObject()

MyObject 是否有可能在任何时候看到它已被分配给变量名称 x?就像它的 __init__ 方法一样?

最佳答案

是的,这是可能的*。然而,这个问题比乍看起来更难:

  • 可能有多个名称分配给同一个对象。
  • 可能根本没有名字
  • 相同的名称可能指的是不同 namespace 中的其他一些对象。

无论如何,了解如何查找对象的名称有时对调试很有用 - 以下是如何做到这一点:

import gc, inspect

def find_names(obj):
    frame = inspect.currentframe()
    for frame in iter(lambda: frame.f_back, None):
        frame.f_locals
    obj_names = []
    for referrer in gc.get_referrers(obj):
        if isinstance(referrer, dict):
            for k, v in referrer.items():
                if v is obj:
                    obj_names.append(k)
    return obj_names

如果您曾经想过围绕变量名称构建逻辑,请稍等片刻,考虑一下重新设计/重构代码是否可以解决问题。从对象本身恢复对象名称的需要通常意味着您的程序中的底层数据结构需要重新考虑。

* 至少在 Cpython 中

关于python - 对象可以检查分配给它的变量的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875202/

相关文章:

python - 将 3D 切片绘制为热图

Python - 如何更新多维字典

Python:读取文件时如何忽略两个特定单词之间的文本?

python - 它们是 "same"吗? (代码 war )

python - 在 Python 中等号后打印字符串?

python - BeautifulSoup 使用可迭代而不是字符串?

python - 为什么在 Socket 和 TCP 上从 Redis 获取数据非常慢?

python - 使用 python flickr lib 从标签中搜索图像 - 但没有 api key

python - docker 无法从文件连接到 redis

python - 如何使用 Altair 在散点图中突出显示标记?