web-dev-qa-db-ja.com

インポートされた関数にデコレータを適用しますか?

関数をインポートしたい:

from random import randint

次に、それにデコレータを適用します。

@decorator
randint

これには構文糖衣構文があるのだろうか(上記のように)、それとも次のようにする必要があるのでしょうか。

@decorator
def randintWrapper(*args):
    return random.randint(*args)
30
killajoule

デコレータは、関数オブジェクトを装飾されたバージョンに置き換えるための単なる構文糖衣です。ここで、装飾呼び出し(元の関数オブジェクトを渡す)です。言い換えると、構文は次のとおりです。

@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定義の結果は最初にバインドされません(現在の名前空間でそれらの名前に割り当てられます)。デコレータはスタックから直接オブジェクトを渡され、デコレータ呼び出しの結果のみがバインドされます。

35
Martijn Pieters