如何将额外参数传递给Python装饰器?

我有一个像下面这样的装饰师

def myDecorator(测试函数):
返回callSomeWrapper(test_func)
def callSomeWrapper(测试函数):
返回测试函数
@我的装饰师
def someFunc():
打印“你好”

我想让这个装饰师接受下面的另一个论点

def myDecorator(test_func,logIt):
如果登录:
打印“调用函数:”+测试函数名称__
返回callSomeWrapper(test_func)
@myDecorator(假)
def someFunc():
打印“你好”

但是这个代码给出了错误

TypeError:myDecorator()正好接受2个参数(给定1个)

为什么函数不能自动传递?如何显式地将函数传递给decorator函数

由于您像调用函数一样调用decorator,因此它需要返回另一个函数,即实际的decorator:

def my_decorator(参数):
def实际_装饰器(func):
打印(“装饰函数{},带参数{}”。格式(func.\uu name\uuuu,param))
返回函数_wrapper(func)#假设我们在某处定义了一个包装器
返回实际值修饰符

外部函数将被赋予显式传递的任何参数,并且应该返回内部函数。内部函数将传递函数进行装饰,并返回修改后的函数

通常,您希望装饰程序通过将其包装到包装器函数中来更改函数行为。下面是一个示例,在调用函数时可以选择添加日志记录:

定义日志装饰器(日志已启用):
def实际_装饰器(func):
@functools.wrapps(func)
def包装(*args,**kwargs):
如果已启用log_:
打印(“调用函数:+func.\uuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回函数(*args,**kwargs)
返回包装器
返回实际值修饰符

functools.wrapps调用将名称和docstring之类的内容复制到包装器函数中,使其与原始函数更为相似

用法示例:

&gt&燃气轮机&燃气轮机@日志装饰器(真)
... def f(x):
...     返回x+1
...
&燃气轮机&燃气轮机&燃气轮机;f(4)
调用函数:f
5.

发表评论