装饰器python库隐藏了args里面的kwargs

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,如何在不使用"自制"装饰器的情况下解决这个问题.

谢谢.

kin*_*all 5

仅仅因为你调用函数b=2不会产生b关键字参数; b是原始函数中的位置参数.如果没有命名的参数b并且您指定了b=2,那么 b将成为关键字参数.

decorator的行为实际上是最正确的; 它生成的包装器具有相同的签名funcion(),而由"自制"装饰器生成的包装器没有b作为命名参数."自制"包装器"错误地"放入b,kwargs因为隐藏了来自调用者的签名myfuncion(),这清楚地表明b不是关键字arg.

保留功能签名是一个功能,而不是一个bug decorator.