「デコレートされた関数定義が一時的な名前の束縛をもたらさない」とはどういう意味ですか?デコレータとPythonでの一時的な名前のバインド
私は今、Pythonでデコレータを勉強しています。この文は私を本当に混乱させました。
「デコレートされた関数定義が一時的な名前の束縛をもたらさない」とはどういう意味ですか?デコレータとPythonでの一時的な名前のバインド
私は今、Pythonでデコレータを勉強しています。この文は私を本当に混乱させました。
デコレータが適用される前に、デコレータされた関数がネームスペース内の何にも割り当てられないということです。デコレータを使って関数を書くと、書く関数は引数としてデコレータに渡され、デコレータが返すオブジェクトは関数として扱われます。ここでは簡単な例です:
def dec(func):
print('times_two' in globals())
def _inner(*args, **kwargs):
print("Decorated")
return func(*args, **kwargs)
return _inner
@dec
def times_two(x):
return x*2
print('times_two' in globals())
あなたはこのランニングhereを見ることができます。デコレータが機能を「装飾」する前に、名前「times_two」がバインドされていないため、のdec
はFalse
と表示されます。
"関数定義は、1つ以上のデコレータ式でラップすることができます。デコレータ式は、関数定義時に評価され、関数定義を含むスコープ内で評価されます。戻り値は、関数オブジェクトの代わりに関数名にバインドされます。複数のデコレータはネストされた形で適用されます。たとえば、次のコード "これら2つのステートメントは同じですか? –
@ HongliBuどの2つのステートメント? –
私の質問とコメントの文 –
コンテキストを確認する必要があります。 – user2357112