Python装饰器模块kwargs

2024-10-01 13:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

使用michelesimionato的decorator模块,我得到了一个关于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}

是被通缉的行为吗?为什么会这样?你知道吗

还是我做错什么了?你知道吗


Tags: 模块thein示例returndefwithtrace
2条回答

对于当前的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}

这似乎是预期的行为。从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关键字参数如何显示为常规参数,而不是关键字参数。你知道吗

相关问题 更多 >