我正在尝试编写一个python装饰器来覆盖函数参数,但是我真的迷失在inner()函数中。在这里修改args的正确方法是什么?
def override(*override_args, **override_kwargs):
def outer(f):
def inner(*args, **kwargs):
...
...
return inner
return outer
@override('Cat')
def my_function(animal, **kwargs):
print animal
print kwargs
my_function('Mouse', k1='1', k2='10')
def override(*override_args, **override_kwargs):
def outer(f):
def inner(*args, **kwargs):
min_args_length = min(len(args), len(override_args))
args = list(args)
for i in xrange(min_args_length):
args[i] = override_args[i]
kwargs.update(override_kwargs)
return f(*args, **kwargs)
return inner
return outer
@override('Cat', 'male', k1='0')
def my_function(animal, **kwargs):
print animal
print kwargs
my_function('Mouse', k1='1', k2='10')
输出:
Cat
{'k2': '10', 'k1': '0'}
说明:
args是一个包含没有名称的args的元组,我们最多可以覆盖其中的min(len(args),len(override_args))。
kwargs是一个字典,其中包含名为args的键:值对。只需将override_kwargs更新为kwargs
我强烈建议您仅覆盖命名参数“ kwargs”,以防止参数不匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句