Для декоратора, который я пишу, я хотел бы манипулировать определенным именованным параметром функции. Рассмотрим следующий декоратор:
def square_param(param):
def func_decorator(func):
def func_caller(*args,**kwargs):
kwargs[param] = kwargs[param] * kwargs[param]
return func(*args,**kwargs)
return func_caller
return func_decorator
Применяется к следующей функции:
@square_param('dividend')
def quotient(divisor=1,dividend=0):
return dividend/divisor
Это будет работать, если дивиденд вызывается как аргумент ключевого слова, например:
>>> quotient(dividend=2)
4
Однако, если он задан в качестве позиционного аргумента, это не сработает.
>>> quotient(3,4)
TypeError: quotient() got multiple values for keyword argument 'dividend'
В Python 3 я мог решить эту проблему, заставив параметр всегда указываться как ключевое слово а>:
@square_param('dividend')
def quotient(divisor=1,*,dividend=0):
return dividend/divisor
но я хотел бы поддерживать Python 2, а также хотел бы наложить как можно меньше ограничений на функцию.
Есть ли способ исправить это поведение в моем декораторе?