使用Michele Simionato的装饰模块,我对kwargs有一种奇怪的行为。以下是使用in the documentation的简单示例的示例:
def _trace(f, *args, **kw):
kwstr = ', '.join('%r: %r' % (k, kw[k]) for k in sorted(kw))
print("calling %s with args %s, {%s}" % (f.__name__, args, kwstr))
return f(*args, **kw)
def trace(f):
return decorate(f, _trace)
@trace
def f(a, b, c=1, d=1):
return a + b + c + d
f(1,2,c=2,d=2)
打印calling f with args (1, 2, 3, 4), {}
而不是calling f with args (1, 2), {'c': 2, 'd': 2}
是否需要行为?为什么这样?
或者我弄错了什么?
答案 0 :(得分:1)
这似乎是预期的行为。来自page you linked:
>>> @trace
... def f(x, y=1, z=2, *args, **kw):
... pass
>>> f(0, 3)
calling f with args (0, 3, 2), {}
>>> print(getargspec(f))
ArgSpec(args=['x', 'y', 'z'], varargs='args', varkw='kw', defaults=(1, 2))
请注意y
和z
关键字参数如何显示为常规参数,而不是关键字参数。
答案 1 :(得分:0)
f(a,b,c = 1,d = 1)的当前原型的期望不正确,它只是默认参数类型。更改f以接受keyargs-
@trace
def f(a, b, **kargs):
return a + b + kargs['c'] + kargs['d']
f(1,2,c=2,d=2)
calling f with args (1, 2), {'c': 2, 'd': 2}