Декоратор Python, который добавляет совместимость параметров ключевых слов с Python2 и Python3 - PullRequest
0 голосов
/ 05 сентября 2018

Я пишу декоратор, который добавляет ключевые аргументы в упакованную функцию. В этом примере декоратор добавляет ключевые слова 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 одновременно?

1 Ответ

0 голосов
/ 05 сентября 2018

Я думаю, вам нужно сделать что-то вроде изменения 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)
...