出于调试目的,我们希望获取已知给定对象的所有名称;我想要限定名称(即,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)
问题是我无法从容器本身找到容器的“名称”,除非容器属于__dict__
类或模块(然后__qualname__
或__name__
工作)。我不知道为什么__class__
不是实例的一部分__dict__
(它是否存储在插槽中?),但原因并不重要 - 重要的是我无法得到它。
我能做些什么来使它工作如下:
class A:
pass
a = A()
a.x = object()
find_names(a.x) # I want this to return `a.x` rather than `???.x`