Python 装饰器添加了与 Python2 和 Python3 的关键字参数兼容性

标签 python python-decorators

我正在编写一个装饰器,它将关键字参数添加到包装的函数中。在本例中,装饰器添加关键字 deco0deco1

def my_decorator(f):
    def inner(arg0, *args, deco0='deco0', deco1='deco1', **kwargs):
        """We assume decoarted functions will take at least one positional arg0"""
        print("Decorated({}, {})".format(deco0, deco1))
        return f(arg0, *args, **kwargs)
    return inner

@my_decorator
def add2(x):
    return x + 2

@my_decorator
def my_mult(x, y):
    return x * y

if __name__ == '__main__':
    print(add2(5))
    print(add2(5, deco0='BLA'))
    print(my_mult(2, 10))
    print(my_mult(2, 10, deco1='BLAM'))

结果符合预期:

Decorated(deco0, deco1)
7
Decorated(BLA, deco1)
7
Decorated(deco0, deco1)
20
Decorated(deco0, BLAM)
20

装饰器返回的inner的函数签名与python2不兼容:

File "./deco.py", line 5
  def inner(arg0, *args, deco0='deco0', deco1='deco1', **kwargs):
                             ^
SyntaxError: invalid syntax

Python2中有没有一种设计模式可以方便装饰器添加关键字参数?或者更好的是,同时兼容 Python2 和 Python3 的模式?

最佳答案

我认为你必须在内部函数内做一些类似修改kwargs的事情:

def inner(arg0, *args, **kwargs):
    deco0 = kwargs.pop('deco0', 'deco0')
    deco1 = kwargs.pop('deco1', 'deco1')
    print("Decorated({}, {})".format(deco0, deco1))
    return f(arg0, *args, **kwargs)

关于Python 装饰器添加了与 Python2 和 Python3 的关键字参数兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189910/

相关文章:

python - 如何重写此类中的函数?

python - <__main__.person object at 0x02887790>> 的绑定(bind)方法 person.get_name 是什么意思

python - 如何正确使用装饰器? (类型错误: wrapper() takes 0 positional arguments but 1 was given)

python - 内存装饰器保存存储的值

python - 用于获取 <p> 内所有数据的 Xpath 表达式

python - PyQt - 从字典创建按钮

python - 防止在多处理中调用 __del__

python - 测试 python 备忘录装饰器

python : Set method attribute from within method

python - 将装饰器应用于访问类属性的类方法