为什么这个带有参数的装饰器不起作用?
def decAny( f0 ):
def wrapper( s0 ):
return "<%s> %s </%s>" % ( any, f0(), any )
return wrapper
@decAny( 'xxx' )
def test2():
return 'test1XML'
print( test2() )
总是给我一个错误,说“str is not callable” 它试图在 wrapper() 中执行返回字符串 而不是处理它并返回结果字符串
最佳答案
装饰器是返回函数的函数。当“将参数传递给装饰器”时,您实际上在做的是调用一个返回装饰器的函数。所以decAny()
应该是一个返回函数的函数。
它看起来像这样:
import functools
def decAny(tag):
def dec(f0):
@functools.wraps(f0)
def wrapper(*args, **kwargs):
return "<%s> %s </%s>" % (tag, f0(*args, **kwargs), tag)
return wrapper
return dec
@decAny( 'xxx' )
def test2():
return 'test1XML'
例子:
>>> print(test2())
<xxx> test1XML </xxx>
请注意,除了解决您遇到的具体问题外,我还通过添加 *args
和 **kwargs
作为包装函数的参数来改进您的代码并将它们传递给装饰器内的 f0
调用。这样一来,您就可以装饰一个接受任意数量的位置参数或命名参数的函数,并且它仍然可以正常工作。
您可以在此处阅读有关 functools.wraps()
的信息:
http://docs.python.org/2/library/functools.html#functools.wraps
关于python - 将参数传递给python中的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624801/