“got multiple values for keyword argument” when using *args, **kwargs in a python function

爷,独闯天下 提交于 2020-01-23 07:47:28

问题


When passing a named parameter request through **kwargs, I get an error-

Traceback (most recent call last):
  File "testKwargs.py", line 9, in <module>
    load_strategy(request="myReq", backend="myBackend", redirect_uri=None, *args, **kwargs)
  File "testKwargs.py", line 5, in load_strategy
    get_strategy("backends", "strategy", "storage", *args, **kwargs)
TypeError: get_strategy() got multiple values for keyword argument 'request'

The code in testKwargs.py is below-

def get_strategy(backends, strategy, storage, request=None, backend=None, *args, **kwargs):
    print request

def load_strategy(*args, **kwargs):
    get_strategy("backends", "strategy", "storage", *args, **kwargs)

args = ([],)
kwargs = {"acess_token":"myAccToken", "id":"myId"}
load_strategy(request="myReq", backend="myBackend", redirect_uri=None, *args, **kwargs)

I was expecting that there would be one key-value pair for the key request in the **kwargs of load_strategy which was passed on to the request parameter in get_stragegy, but that doesn't seem to be the case.

I am trying to figure out what I am missing here.


回答1:


You are passing in an extra positional argument:

args = ([],)

There is one value in that tuple, a list object. It is applied after the other three arguments passed to get_strategy(), so to request. Python sees you calling:

get_strategy("backends", "strategy", "storage", [],
             request="myReq", backend="myBackend", redirect_uri=None, 
             acess_token="myAccToken", id="myId")

and the 4 positional arguments are applied against the backends, strategy, storage and request parameters respectively.

If you meant to pass in 3 positional arguments, then specify args as an empty tuple:

args = ()

and things work just fine:

>>> def get_strategy(backends, strategy, storage, request=None, backend=None, *args, **kwargs):
...     print request
... 
>>> def load_strategy(*args, **kwargs):
...     get_strategy("backends", "strategy", "storage", *args, **kwargs)
... 
>>> args = ()
>>> kwargs = {"acess_token":"myAccToken", "id":"myId"}
>>> load_strategy(request="myReq", backend="myBackend", redirect_uri=None, *args, **kwargs)
myReq


来源:https://stackoverflow.com/questions/20600870/got-multiple-values-for-keyword-argument-when-using-args-kwargs-in-a-pytho

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!