デバッグの目的で、特定のオブジェクトが知られているすべての名前を取得したいと考えています。修飾名 (つまり、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`