在python中将参数传递给装饰器

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() )
Run Code Online (Sandbox Code Playgroud)

总是给我一个错误,说"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'
Run Code Online (Sandbox Code Playgroud)

例:

>>> print(test2())
<xxx> test1XML </xxx>
Run Code Online (Sandbox Code Playgroud)

请注意,除了修复您遇到的特定问题之外,我还通过添加*args**kwargs作为包装函数的参数并将它们传递给f0装饰器内部的调用来改进您的代码.这使得它可以装饰一个接受任意数量的位置或命名参数的函数,它仍然可以正常工作.

你可以functools.wraps()在这里阅读:http:
//docs.python.org/2/library/functools.html#functools.wraps