Python 查找引用给定对象的限定名称
出于调试目的,我们希望获得已知给定对象的所有名称;我想要限定名,即A.x而不是x。这是我们的第一次尝试:Python 查找引用给定对象的限定名称,python,debugging,python-3.x,garbage-collection,introspection,Python,Debugging,Python 3.x,Garbage Collection,Introspection,出于调试目的,我们希望获得已知给定对象的所有名称;我想要限定名,即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] i
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。我不知道为什么类不是实例的dict的一部分,它是否存储在插槽中?但原因并不重要-重要的是我无法获取它
我能做些什么来让它工作如下:
class A:
pass
a = A()
a.x = object()
find_names(a.x) # I want this to return `a.x` rather than `???.x`
我想我可以通过检查与实例对应的任何引用方的引用方,并查找其uuu dict uuuu与原始引用方相同的引用方:
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]
break
if n == '???':
parents = gc.get_referrers(referrer)
for p in parents:
if getattr(p, '__dict__', None) is referrer:
n = '<instance of class ' + p.__class__.__name__ + '>'
result.append(str(n) + '.' + str(k))
return '\n'.join(sorted(result))