Для декоратора, которого я пишу, я хотел бы манипулировать определенным именованным параметром функции.Рассмотрим следующий декоратор:
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, а также я хотел бы наложить как можно меньше ограничений на функцию.
Есть ли способ, которым я могу исправить это поведение в моем декораторе?