def f():
return
g=f
g.func_name は "f" です
どうすれば「グ」を取得できますか?
EDIT: gc.get_referrers
存在しますが、関数オブジェクトへのどの参照がそれを呼び出すために使用されたかはわかりませんので、役に立ちません。また、その関数を使用する際の注意点があり、CPython 以外の実装で動作するかどうかはわかりません。製品コードでの使用はお勧めできません。
最後に、FAQ は、オブジェクトの名前を特定できるかどうかについて完全に正しいとは限りませんが、完全に実行する必要があるかどうかについての洞察です。
fがdefによって作成されると、属性付きの__name__が同時に作成されます。その属性は関数オブジェクトに割り当てられ、後で関数を何に割り当てても保持されます。
一般に、オブジェクトは自分が指している変数を認識していません。
ただし、実装固有のロジックを使用してオブジェクトへのすべての参照を見つけるよりも、 gc.get_referrers() のようなツールがあります。
>>> def f(x):
return x**2
>>> g = f
>>> import gc
>>> gc.get_referrers(f)[0].keys()
['g', 'f', '__builtins__', '__package__', 'gc', '__name__', '__doc__']
もう 1 つの手法は、特定のオブジェクトのすべてのインスタンスの名前空間をスキャンすることです。
>>> [key for key, value in globals().items() if value == f]
['g', 'f']
モジュールを使用してソースコードを検査することでそれを実行できる場合がありますがinspect
、いくつかの制限があります(少なくとも、問題の名前が記載されている行を取得できる必要があります)。
なぜそれが必要なのかを本当に理解していない限り、絶対にそうすべきではありません。
a = 1
b = 1
c = 1
1の名前は?その質問は意味がありますか?
1
関数は、やなどの他のオブジェクトと同様にオブジェクト"cats"
です。元々定義されていた名前を示す__name__
属性がありますが、他の名前を割り当てることができ、これらの割り当てのオブジェクトに関する記録は保持されません。
すべてのローカル変数とグローバル変数を検索できますが、すべての参照が見つかるわけではありません。関数への参照は、辞書やリストなどのコンテナー、オブジェクトの属性、他のモジュールのグローバルとして保持できます。また、おそらく私が今考えていない他の場所にも保持できます。おー!閉鎖。それでも、これは要点です:
def f():
pass
g = f
allvars = dict(globals())
allvars.update(locals())
funcnames = [key for (key, value) in allvars.iteritems() if value is f]
# returns ['g', 'f']