関数をインポートしたい:
from random import randint
次に、それにデコレータを適用します。
@decorator
randint
これには構文糖衣構文があるのだろうか(上記のように)、それとも次のようにする必要があるのでしょうか。
@decorator
def randintWrapper(*args):
return random.randint(*args)
デコレータは、関数オブジェクトを装飾されたバージョンに置き換えるための単なる構文糖衣です。ここで、装飾は呼び出し(元の関数オブジェクトを渡す)です。言い換えると、構文は次のとおりです。
@decorator_expression
def function_name():
# function body
大まかに(*) 次のように変換されます。
def function_name():
# function body
function_name = decorator_expression(function_name)
あなたの場合、代わりに手動でデコレータを適用できます。
from random import randint
randint = decorator(randint)
(*) 関数またはクラスで@<decorator>
を使用する場合、def
またはclass
定義の結果は最初にバインドされません(現在の名前空間でそれらの名前に割り当てられます)。デコレータはスタックから直接オブジェクトを渡され、デコレータ呼び出しの結果のみがバインドされます。