Jor*_*ona 2 python decorator kwargs
我在装饰器库中遇到了一个非常奇怪的行为,在下一个代码中对此进行了解释:
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)
Run Code Online (Sandbox Code Playgroud)
执行此脚本打印:
$ python /tmp/test.py
Decorator: 1 (2,) {}
Home made decorator: 1 () {'b': 2}
Run Code Online (Sandbox Code Playgroud)
'decorator'隐藏了args中的kwargs,如何在不使用"自制"装饰器的情况下解决这个问题.
谢谢.
仅仅因为你调用函数b=2不会产生b关键字参数; b是原始函数中的位置参数.如果没有命名的参数b并且您指定了b=2,那么 b将成为关键字参数.
decorator的行为实际上是最正确的; 它生成的包装器具有相同的签名funcion(),而由"自制"装饰器生成的包装器没有b作为命名参数."自制"包装器"错误地"放入b,kwargs因为隐藏了来自调用者的签名myfuncion(),这清楚地表明b不是关键字arg.
保留功能签名是一个功能,而不是一个bug decorator.
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |