Для декоратора, который я пишу, я хотел бы манипулировать определенным именованным параметром функции. Рассмотрим следующий декоратор:Как я могу рассматривать позиционные аргументы как аргументы ключевого слова в Python 2
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
Applied на следующей функции:
@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 я мог бы решить эту проблему, заставляя параметр быть always given as a keyword:
@square_param('dividend')
def quotient(divisor=1,*,dividend=0):
return dividend/divisor
, но я хотел бы поддержать Python 2, а также я хотел бы поставить в небольшие ограничения на функции ,
Есть ли способ, которым я могу исправить это поведение в моем декораторе?
Осмотрите инспектировать модуль. У этого может быть то, что вам нужно. Посмотрите на getargspec. – Dirk