ZEE*_*ZEE 5 python parameters decorator
为什么这个装饰器的参数不起作用?
def decAny( f0 ):
    def wrapper( s0 ):
        return "<%s> %s </%s>" % ( any, f0(), any )
    return wrapper
@decAny( 'xxx' )
def test2():
    return 'test1XML'
print( test2() )
总是给我一个错误,说"str不可调用"它试图在wrapper()中执行返回字符串而不是处理它并返回结果字符串
And*_*ark 16
装饰器是返回函数的函数.当"将参数传递给装饰器"时,您实际在做的是调用返回装饰器的函数.所以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