python - 将参数传递给python中的装饰器

标签 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 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/

相关文章:

module - 如何从特定模块创建所有装饰函数的向量?

python - Django 迁移 : Not reflecting changes | creates only id

python - 在 Python 中压缩图像(无存档)

c++ - 使用参数和在函数中声明有什么区别

java - 对象...对象[] 和格式

python - 是否可以在 Django 项目中重新定义反向?

python - 替换python中的 '\'字符

python - 在 Python 中避免硬编码文件路径的方法

java - 有没有办法检查泛型参数 (HashMap<Integer, ArrayList<?>>) 是否属于某种类型?

python - Python 中的 []-esque 装饰器语法是什么意思?