Python论证了装饰器功能

问题描述 投票:1回答:1

我有这个例子:

def decorator_function_with_arguments(arg1, arg2, arg3):
    def wrap(f):
        print("Inside wrap")
        def wrapped_f(*args):
            print("Pre")
            print("Decorator arguments:", arg1, arg2, arg3)
            f(*args)
            print("Post")
        return wrapped_f
    return wrap

@decorator_function_with_arguments("hello", "world", 42)
def sayHello(a1, a2, a3, a4):
    print('sayHello arguments:', a1, a2, a3, a4)

sayHello("say", "hello", "argument", "list")

输出是:

Inside wrap Pre Decorator arguments: hello world 42 sayHello arguments: say hello argument list Post

我将其解释如下:decorator_function_with_arguments获得了它的3个参数。它输出一个函数(wrap),它接收一个函数并输出一个函数,这是装饰的目的。所以现在wrap将被执行(“内部包裹”被打印),装饰发生,wrap采取sayHello并把它放入wrapped_f,我们返回。现在,如果我打电话给sayHello它将是它的包装版本,所以其余的打印出来。好的,但现在如果我写这个:

def argumented_decor(dec_arg1):
    def actual_decor(old_func):
        print("Pre Wrapped")
        def wrapped():
            print("Pre Main")
            print(dec_arg1)
            old_func()
            print("Post Main")
        return actual_decor
    return actual_decor

@argumented_decor("Decor Argument")
def f2():
    print("Main")

f2()

当调用f2时,我收到错误消息:TypeError: actual_decor() missing 1 required positional argument: 'old_func'

为什么? argumented_decor得到它的论点,actual_decor将被执行,“Pre Wrapped”将被打印,f2将被包裹。现在如果我调用它,它应该作为最内在的wrapped函数。为什么不?我希望我可以理解我的问题。谢谢!

python python-decorators
1个回答
2
投票

你的actual_decor函数应该在返回包装函数wrapped时返回:

def argumented_decor(dec_arg1):
    def actual_decor(old_func):
        print("Pre Wrapped")
        def wrapped():
            print("Pre Main")
            print(dec_arg1)
            old_func()
            print("Post Main")
        return wrapped
    return actual_decor
© www.soinside.com 2019 - 2024. All rights reserved.