请考虑以下事项:
def my_wrapper(wrapper_argument=False, *args, **kwargs):
return my_function(*args, **kwargs)
def my_function(arg1, arg2, params=None):
# do_stuff
return result
当我用以下方式调用上述内容时:
my_wrapper('foo', 'bar', wrapper_argument=True)
我明白了:
TypeError: my_function() got multiple values for argument 'wrapper_argument'
为什么呢?参数的排序可能是错误的吗?
答案 0 :(得分:5)
您正在为foo
分配wrapper_argument
(因为它是第一个位置参数);然后你再次将它作为一个可选的关键字参数进行分配。
当您将这些参数从包装器传递给callable时,Python会弹出错误。
为避免这种情况,请不要传入类似于现有关键字参数的可选关键字参数。
答案 1 :(得分:4)
由于问题是针对Python 3,您可以按如下方式重新排序函数定义中的参数:
而不是:
def my_wrapper(wrapper_argument=False, *args, **kwargs):
做的:
def my_wrapper(*args, wrapper_argument=False, **kwargs):
并保持其他一切相同。
答案 2 :(得分:1)
是:wrapper_argument
首先获得默认值,然后是新值,这是不合法的。如果您希望按位置传递其他参数,以便它们最终位于args
而不是kwargs
,则必须在wrapper_argument
位置传递。一个简化的例子,您可能已发布的那种。
def f(a=False, *args, **kwargs):
print(a, args, kwargs)
f(True, 'a', 'b')
#
True ('a', 'b') {}