Python - 在本地函数调用中解压缩kwargs

时间:2016-10-21 14:15:25

标签: python kwargs

我想传递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)

我该怎么纠正这个?

3 个答案:

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

此时,代码应该按照您的预期方式工作。但是,我质疑**kwargslastfm_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)

这样,您可以确保调用方必须传入artisttrack,否则函数调用将失败。