[英]Decorator/wrapper: How to deal with arguments after positional/keyword args are all assigned to wrapped function's parameters?
[英]Keyword arguments for function wrapped with decorator not working
我在装饰器上找到的所有教程都建议在包装函数的签名中使用*args, **kwargs
处理包装函数中的参数。 但是,kwarg无效,而普通args则有效:
from functools import wraps
def wrapper(a_thing):
@wraps(a_thing)
def do_thing(*args, **kwargs):
print('before')
print(kwargs)
value = a_thing(*args, **kwargs)
print("after", *args, **kwargs)
return value
return do_thing
@wrapper
def output(*args, **kwargs):
print('during', *args, **kwargs)
import pdb; pdb.set_trace()
这是我的交互式输出:
(Pdb) output(99, 100)
before
{}
during 99 100
after 99 100
(Pdb) output(arg1=99, arg2=100)
before
{'arg1': 99, 'arg2': 100}
*** TypeError: 'arg1' is an invalid keyword argument for this function
(Pdb)
下面是一个例子很多这样的教程之一:
如果无法使用** kwargs有什么意义? 我觉得我想念什么。
您不想拆开print
电话的print
; print
仅接受有限数量的关键字参数,而将拒绝所有其他参数。 大概您只是想看看传递了什么,因此无需打开包装即可打印原始tuple
和dict
:
def wrapper(a_thing):
@wraps(a_thing)
def do_thing(*args, **kwargs):
print('before')
print(kwargs)
value = a_thing(*args, **kwargs)
print("after", args, kwargs) # Removed unpacking
return value
return do_thing
@wrapper
def output(*args, **kwargs):
print('during', args, kwargs) # Removed unpacking
拆包的要点是,它将*
拆包的iterable的元素作为顺序位置参数传递,并将**
拆包映射中的键值对使用键作为关键字参数,并将值作为关联值。 因此,当您这样做时:
print('during', *args, **kwargs)
已经使用output(arg1=99, arg2=100)
调用了函数,就好像您在运行:
print('during', arg1=99, arg2=100)
arg1
和arg2
都不是print
接受的关键字,因此它大叫您。 通过拆开包装, print
等同于:
print('during', (), {'arg1': 99, 'arg2': 100})
这是完全有效的(它直接打印tuple
和dict
,而不是尝试解压缩)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.