我正在编写一个装饰器,它将关键字参数添加到包装的函数中。在本例中,装饰器添加关键字 deco0
和 deco1
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/