python - 装饰器 python 库将 kwargs 隐藏在 args 中

标签 python decorator keyword-argument

我在装饰器库中遇到了一个非常奇怪的行为,这在下一个代码中有解释:

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=2then b 将成为关键字参数。

decorator的行为其实是最正确的;它生成的包装器具有与 funcion() 相同的签名,而由您的“自制”装饰器制作的包装器没有 b 作为命名参数。 “自制”包装器“错误地”将 b 放入 kwargs 中,因为 myfuncion() 的签名清楚表明 b 不是关键字参数,对调用者隐藏。

保留函数签名是 decorator 中的一项功能,而不是错误。

关于python - 装饰器 python 库将 kwargs 隐藏在 args 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700432/

相关文章:

python - 如何将变量值作为关键字参数键传递?

python - 嵌套列表理解中for语句排序的原因是什么

javascript - Python bokeh CustomJS 回调更新 DataTable 小部件

c++ - 将一个函数传递给 C++ 中的另一个函数,其中参数的数量可以不同

iphone - 装饰模式问题,iOS/UICollectionViewCells

python - ** lambda 函数列表理解中的 kwargs

python - xlsxwriter Pandas 框架: to highlight rows if there are blank cells within a column

python - 通过变量修改嵌套字典

python - 为什么在 Python Flask 中使用类与装饰器?

python - 使用 kwargs 创建namedtuple实例