我想传递dictionary
:
items = {"artist": "Radiohead", "track": "Karma Police"}
作为此function
的参数:
def lastfm_similar_tracks(**kwargs):
result = last.get_track(kwargs)
st = dict(str(item[0]).split(" - ") for item in result.get_similar())
print (st)
其中last.get_track("Radiohead", "Karma Police")
是调用本地function
的正确方法。
然后像这样调用它:
lastfm_similar_tracks(items)
我收到了这个错误:
TypeError: lastfm_similar_tracks() takes exactly 0 arguments (1 given)
我该怎么纠正这个?
答案 0 :(得分:5)
基本上,函数定义中的** kwargs意味着不应将命名参数解包为变量。
要使用参数字典调用某些函数,这些函数仍需要表示为命名参数。其他python“考虑”提供的参数是位置
因此,您应该将您的功能称为:
items = {"artist": "Radiohead", "track": "Karma Police"}
lastfm_similar_tracks(**items)
答案 1 :(得分:3)
一些混淆:
您将字典items
作为参数传递,而不是双星。这意味着items
被视为第一个位置参数,而您的函数仅定义了**kwargs
。
这是一个简单的功能:
>>> def f(**kwargs):
... print (kwargs)
让我们通过items
:
>>> items = {"artist": "Radiohead", "track": "Karma Police"}
>>> f(items)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 0 positional arguments but 1 was given
糟糕:不允许使用位置参数。您需要使用双星,以便打印:
>>> f(**items)
{'artist': 'Radiohead', 'track': 'Karma Police'}
这引出了下一个问题:函数内部的kwargs
是字典,因此您无法将其传递给last.get_track
,其中有两个根据您的示例,位置参数。假设订单很重要(几乎可以肯定),你需要从字典中获取正确的值:
result = last.get_track(kwargs['artist'], kwargs['track'])
答案 2 :(得分:1)
第一个问题:您需要像这样传递items
:
lastfm_similar_tracks(**items)
第二个问题,在lastfm_similar_tracks
内,kwargs
是一个字典,其中的键没有特定的顺序,因此在传入get_track
时无法保证顺序。你能做的最好的是:
result = last.get_track(kwargs['artist'], kwargs['track'])
此时,代码应该按照您的预期方式工作。但是,我质疑**kwargs
中lastfm_similar_tracks
的用法:你真的需要这样定义吗?怎么样:
def lastfm_similar_tracks(artist, track, **kwargs):
result = last.get_track(artist, track)
# The rest of your code here
然后你可以这样称呼它:
lastfm_similar_tracks(**items)
这样,您可以确保调用方必须传入artist
和track
,否则函数调用将失败。