【发布时间】:2021-03-01 18:07:13
【问题描述】:
从我目前阅读的关于将参数传递给装饰器的教程中,他们都提到了如何装饰函数,例如:
@decorator_with_args(arg)
def foo(*args, **kwargs):
pass
翻译为:
foo = decorator_with_args(arg)(foo)
或
def my_decorator(arg):
def inner_decorator(f):
def wrapped(*args, **kwargs):
print('before function')
response = f(*args, **kwargs)
print('after function')
return response
print('decorating', f, 'with argument', arg)
return wrapped
return inner_decorator
@my_decorator('foo')
def my_function(a, b):
print('in function')
return a + b
相当于
my_function = my_decorator('foo')(my_function)
这些例子确实是正确的,但不是将我们的函数传递给装饰器并分配给更健壮的变量的第二种方法,因为在这里我们可以随意更改装饰器的参数,例如@ 987654325@ 或 another_function=my_decorator('foo3')(my_function) 而在第一种情况下,参数似乎总是“foo”,除非对于不同的调用,我们返回并更新 @my_decorator 参数,或者重新定义函数,以便我们的装饰器可以采用不同的参数,例如:
@my_decorator('foo2')
def my_function(a, b):
print('in function')
return a + b
@my_decorator('foo5')
def another_function(a, b):
print('in function')
return a + b
当从另一个模块导入装饰函数时,这种行为尤其明显,该模块使用默认装饰器参数调用该函数,但没有提供修改的能力。
如果我遗漏了什么,请纠正我。谢谢。
【问题讨论】:
-
通常不需要将动态参数传递给装饰器......!?装饰器在函数声明时应用,而不是在调用时应用。如果您需要在调用时将动态参数传递给装饰器,那么这不是装饰器的工作。
-
谢谢@deceze,这就解释了。