2

次のサンプルコードがあります。

def say_hello(f):
    def wrap():
        print "Hello"
    return wrap

def say_bye(f):
    def wrap():
        print "Bye"
    return wrap

@say_hello
@say_bye
def process():
    return "Processing"

process()

出力:

Hello

私は次のような出力を期待していました:

Bye
Hello
Processing
  1. 何が間違っている可能性がありますか?
  2. 関数呼び出しの前後に呼び出されるデコレータを作成するには?

つまり、上記の例では、出力できますか:

    Hello
    Processing
    Bye 
4

3 に答える 3

7

デコレータから返された「ラップ」関数は、実際にはラップするはずの関数を呼び出しません。ラップされた関数が呼び出される前に、デコレータから返された関数が呼び出されないため、これは問題です。ラップしている関数を置き換えます。次のデコレータ構文:

@some_decorator
def func(arg):
    function_body()

次のコードのシンタックス シュガーです。

def func(arg):
    function_body()
func = some_decorator(func)

したがって、あなたが望むのは

def say_hello(f):
    def wrap(*args, **kwargs):
        print "Hello"
        return f(*args, **kwargs)
    return wrap

def say_bye(f):
    def wrap(*args, **kwargs):
        return_value = f(*args, **kwargs)
        print "Bye"
        return return_value
    return wrap

@say_hello
@say_bye
def process():
    return "Processing"

これにより、

Hello
Processing
Bye
于 2013-09-06T05:04:53.123 に答える