您必须返回部分作为装饰结果:def decor(func):
return partial(func, v=100)
然而,这个总是设置v=100,即使您按位置为v传递了另一个值。你还是会有同样的问题。在
您需要创建一个decorator,它知道位置参数v是什么,并在那里寻找它作为关键字参数:和:
^{pr2}$
上面的修饰符将v参数设置为100,始终。无论您试图将v设置为位置参数还是关键字参数,最终它都将被设置为100:>>> @decor
... def some_function(a, v, c):
... return a, v, c
...
>>> some_function(1, 2, 3)
(1, 100, 3)
>>> some_function(1, v=2, c=3)
(1, 100, 3)
如果您只想为v提供一个默认参数(如果没有显式设置),则必须反转测试:def decor(func):
vpos = getargspec(func).args.index('v')
def wrapper(*args, **kwargs):
if len(args) <= vpos and 'v' not in kwargs:
kwargs['v'] = 100
return func(*args, **kwargs)
return wrapper
此时,v仅在尚未设置的情况下提供:>>> @decor
... def some_function(a, v, c):
... return a, v, c
...
>>> some_function(1, c=3) # v not set
(1, 100, 3)
>>> some_function(1, 2, c=3) # v is set
(1, 2, 3)
>>> some_function(1, v=2, c=3) # v is set as keyword argument
(1, 2, 3)