我有这个例子:
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
函数。为什么不?我希望我可以理解我的问题。谢谢!
答案 0 :(得分: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