1
为了调试目的,我们希望获取给定对象已知的所有名称;我想要限定名称(即A.x
而不是x
)。下面是我们的第一次尝试:查找引用给定对象的限定名称
import gc, sys
def find_names(obj):
result = []
for referrer in gc.get_referrers(obj):
if isinstance(referrer, dict):
for k in referrer:
if referrer[k] is obj:
n = '???'
for f in ('__qualname__', '__name__'):
if f in referrer:
n = referrer[f]
result.append('{}.{}'.format(n, k))
return ','.join(result)
的问题是,除非容器是一个类或模块(当时__qualname__
或__name__
工作)的__dict__
我找不到从容器容器自身的“名字”。我不知道为什么__class__
不是实例的__dict__
(是否存储在插槽中?)的一部分,但原因并不重要 - 重要的是我无法得到它。
有什么我可以做这个工作如下:
class A:
pass
a = A()
a.x = object()
find_names(a.x) # I want this to return `a.x` rather than `???.x`