查找引用给定对象的限定名称

时间:2013-05-03 04:05:00

标签: 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] 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__的一部分(它存储在插槽中?),但原因并不重要 - 重要的是我无法得到它。 / p>

我能做些什么工作如下:

class A:
    pass
a = A()
a.x = object()
find_names(a.x) # I want this to return `a.x` rather than `???.x`

1 个答案:

答案 0 :(得分:0)

我想我可以通过检查与实例对应的任何引荐来源的引荐来查找__dict__与原始引荐来源相同的引用来实现:

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))