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

Python - unpacking kwargs in local function call

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

我该如何纠正?

基本上,函数定义中的 **kwargs 意味着命名参数不应解包为变量。

要使用参数字典调用某些函数,这些仍然需要表示为命名参数。 Else python "considers" 提供的参数是位置

因此,你应该称你为:

items = {"artist": "Radiohead", "track": "Karma Police"}
lastfm_similar_tracks(**items)

一些混淆:

您正在将字典 items 作为参数传递,但没有双星。这意味着 items 被视为第一个 positional 参数,而您的函数仅定义了 **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,根据您的示例,它有两个 positional 参数。假设顺序很重要(几乎可以肯定),您需要从要传递的字典中获取正确的值:

result = last.get_track(kwargs['artist'], kwargs['track'])

第一个问题:你需要像这样传递items

lastfm_similar_tracks(**items)

第二个问题,在lastfm_similar_tracks里面,kwargs是一个字典,里面的key是没有顺序的,所以传入get_track的时候不能保证顺序。你能做的最好的是:

result = last.get_track(kwargs['artist'], kwargs['track'])

此时,代码应该按您预期的方式工作。但是,我质疑 lastfm_similar_tracks**kwargs 的使用:你真的需要那样定义它吗?怎么样:

def lastfm_similar_tracks(artist, track, **kwargs):
    result = last.get_track(artist, track)
    # The rest of your code here

那么你可以这样称呼它:

lastfm_similar_tracks(**items)

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