【问题标题】:Python decorator that adds keyword parameter compatibility with Python2 and Python3Python 装饰器,增加了与 Python2 和 Python3 的关键字参数兼容性
【发布时间】:2019-02-10 21:09:09
【问题描述】:

我正在编写一个装饰器,它将关键字参数添加到包装函数中。在这个例子中,装饰器添加了关键字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 的模式?

【问题讨论】:

    标签: python python-decorators


    【解决方案1】:

    我认为你必须在内部函数中修改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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2017-01-20
      • 1970-01-01
      • 2018-02-23
      • 2019-06-14
      • 2021-05-08
      • 2010-10-14
      相关资源
      最近更新 更多