我有一个像下面这样的装饰工。
def myDecorator(test_func):
return callSomeWrapper(test_func)
def callSomeWrapper(test_func):
return test_func
@myDecorator
def someFunc():
print 'hello'
我想增强这个装饰器以接受下面的另一个论点
def myDecorator(test_func,logIt):
if logIt:
print "Calling Function: " + test_func.__name__
return callSomeWrapper(test_func)
@myDecorator(False)
def someFunc():
print 'Hello'
但这段代码给出了错误
TypeError: myDecorator() takes exactly 2 arguments (1 given)
为什么函数不能自动传递?如何显式地将函数传递给decorator函数?
因为您像调用函数一样调用decorator,所以它需要返回另一个实际的decorator函数:
外部函数将得到显式传递的任何参数,并应返回内部函数。内部函数将传递要修饰的函数,并返回已修改的函数。
通常您希望decorator通过将函数包装在包装函数中来更改函数行为。下面是一个在调用函数时可选地添加日志记录的示例:
functools.wraps
调用将名称和docstring之类的内容复制到包装器函数,使其更类似于原始函数。示例用法:
只想添加一些有用的技巧,使decorator参数成为可选的。它还可以重用decorator并减少嵌套
只是提供一个不同的观点:语法
相当于
尤其是,
expr
可以是您喜欢的任何东西,只要它的计算结果是可调用的。在specialspecial中,expr
可以是一个decorator工厂:你给它一些参数,它给你一个decorator。所以也许更好的方法是然后可以缩短为
当然,因为它看起来像是一个装饰器,所以人们倾向于将它命名来反映这一点。当你试图遵循间接的层次时,这可能会让人困惑。
相关问题 更多 >
编程相关推荐