Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python装饰器,添加关键字参数与Python2和Python3的兼容性_Python_Python Decorators - Fatal编程技术网

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

Python装饰器,添加关键字参数与Python2和Python3的兼容性,python,python-decorators,Python,Python Decorators,我正在编写一个decorator,它将关键字参数添加到包装函数中。在本例中,装饰器添加关键字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("Decor

我正在编写一个decorator,它将关键字参数添加到包装函数中。在本例中,装饰器添加关键字
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
装饰程序返回的
内部
函数签名与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)