Python装饰模块 - kwargs

时间:2016-02-02 17:31:41

标签: python decorator python-decorators

使用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}

是否需要行为?为什么这样?

或者我弄错了什么?

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))

请注意yz关键字参数如何显示为常规参数,而不是关键字参数。

答案 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}