对于我正在编写的装饰器,我想操作函数的特定命名参数。考虑以下装饰器:
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,并且我想对函数施加尽可能少的限制。
有没有办法可以在我的装饰器中修复这种行为?