我正在使用decorator模块来装饰某些功能。我希望装饰器非常通用,所以我允许它有任意数量的参数和关键字参数(只要有两个以上的参数):
from decorator import decorator
def wrap(f):
return decorator(_wrap, f)
def _wrap(function, t, f, *args, **kwargs):
print 't=', t
print 'f=', f
print 'args=', args
print 'kwargs=', kwargs
@wrap
def read(a, b, c=False, d=True):
pass
read(1, 2, d=True)
问题在于以上回报:
t= 1
f= 2
args= (False, True)
kwargs= {}
但是False
和True
来自c=
和d=
,所以它们不应该在kwargs
中,即:
t= 1
f= 2
args= (,)
kwargs= {'c':False, 'd':True}
答案 0 :(得分:2)
c
和d
是位置参数。它们的名称包含在函数对象的元数据中(因为你使用decorator
,它也保存在包装器上)因此你可以在调用函数时引用它们的名字,但它们仍然是位置参数并通过它们指定它们他们的名字只会导致他们被置于args
的正确位置。它按预期工作,为什么这是一个问题?
答案 1 :(得分:0)
为了以防万一,请查看另一篇文章,讨论相同的问题decorator python library hide the kwargs inside args(并给出与delnan相同的答案)