4

私が持っていると想像してください:

X = [0,1]
Y = X
Z = Y

のようなものを返す referenced_by(X) のような関数はあります['Y', 'Z']か? そして、points_to(Y) のような関数が'X'?を返します。

isオブジェクトが同じかどうかをテストする必要があることは知っていますが、名前を取得する簡単な方法が欲しいだけです。

4

1 に答える 1

2

はいといいえ。グローバル変数のリストを取得できます。

for name, val in globals().items():
    if val is obj:
        yield name

ローカル変数のリストを取得することもできます:

for name, val in locals().items():
    if val is obj:
        yield name

ただし、これにより、関数のローカルまたはモジュールのグローバル以外のコンテキストのすべての変数が失われます。frame-magic を使用して呼び出しコンテキストで変数を見つけることはできますが、たとえば、他のモジュールにグローバルなものを見つけることはできません。

これを何に使うのか、私にはわかりません。

オブジェクトを参照する属性も見つかりませんが、属性は変数ではないため、おそらく問題ありません。

ただし、オブジェクトを参照するすべてのオブジェクトを取得できます。これには、すべての関数のグローバルとローカルが含まれます。ただし、その場合、変数の名前を取得することはできません。できるよ

>>> import gc
>>> gc.get_referrers(obj)

object を参照しているすべてのオブジェクトのリストを取得しますobj。繰り返しますが、これはかなり役に立ちません。:-)

名前が必要な場合は、リファラーが辞書またはスタック フレームの場合にキーを検索できます。

import gc
import types

def find_ref_names(obj):
    for ref in gc.get_referrers(obj):
        if isinstance(ref, types.FrameType):
            look_in = [ref.f_locals, ref.f_globals]
        elif isinstance(ref, dict):
            look_in = [ref]
        else:
            continue
        for d in look_in:
            for k, v in d.items():
                if v is obj:
                    yield k


def main():
    a = "heybaberiba"
    b = a
    c = b

    print list(find_ref_names(b))

if __name__ == '__main__':
    main()

これは印刷されます:

['a', 'c', 'b', 'obj']

aしかし、変数、bcおよびがどのコンテキストで定義されているかわからないためobj、これもまたかなり役に立ちません。例として、 a の定義をモジュール レベルに移動すると、次の結果が得られます。

['c', 'b', 'a', 'obj', 'a', 'a']

これらの 1 つaはグローバル コンテキストであり、その他はローカル コンテキストへのコピーです。

2番目の質問について:

そして、「X」を返す points_to(Y) のような関数はありますか?

それは同じ機能です。XとはどちらもY同じオブジェクト (この場合はリスト) を指す名前です。XYY変わらず、 を指していませんXYを指す[0,1]ようにしXます。

于 2013-07-11T09:48:46.160 に答える