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)

__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`
4

1 に答える 1

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))
于 2013-05-03T08:28:20.377 に答える