我在装饰器库中遇到了一个非常奇怪的行为,这在下一个代码中有解释:
from decorator import decorator
@decorator
def wrap(f, a, *args, **kwargs):
print 'Decorator:', a, args, kwargs
return f(a, *args, **kwargs)
def mywrap(f):
def new_f(a, *args, **kwargs):
print 'Home made decorator:', a, args, kwargs
return f(a, *args, **kwargs)
return new_f
@wrap
def funcion(a, b, *args, **kwargs):
pass
@mywrap
def myfuncion(a, b, *args, **kwargs):
pass
funcion(1, b=2)
myfuncion(1, b=2)
这个脚本的执行打印:
$ python /tmp/test.py
Decorator: 1 (2,) {}
Home made decorator: 1 () {'b': 2}
'decorator' 将 kwargs 隐藏在 args 中,我如何在不使用“自制”装饰器的情况下解决这个问题。
谢谢。
最佳答案
仅仅因为您使用b=2
调用函数不会使b
成为关键字参数; b
是原始函数中的位置参数。如果没有名为 b
的参数并且您指定了 b=2
,then b
将成为关键字参数。
decorator
的行为其实是最正确的;它生成的包装器具有与 funcion()
相同的签名,而由您的“自制”装饰器制作的包装器没有 b
作为命名参数。 “自制”包装器“错误地”将 b
放入 kwargs
中,因为 myfuncion()
的签名清楚表明 b
不是关键字参数,对调用者隐藏。
保留函数签名是 decorator
中的一项功能,而不是错误。
关于python - 装饰器 python 库将 kwargs 隐藏在 args 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700432/