如何为* args和** kwargs修复“为参数提供多个值”错误?

时间:2015-02-05 04:32:34

标签: python python-3.x kwargs

请考虑以下事项:

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'

为什么呢?参数的排序可能是错误的吗?

3 个答案:

答案 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') {}