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)

我应该如何纠正这个?

原文由 8-Bit Borges 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 472
2 个回答

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

 lastfm_similar_tracks(**items)

第二个问题,里面 lastfm_similar_trackskwargs 是一个字典,其中的键没有特定的顺序,因此你不能保证传入 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 否则函数调用将失败。

原文由 Hai Vu 发布,翻译遵循 CC BY-SA 3.0 许可协议

一些混乱的项目:

您正在传递字典 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'])

原文由 brianpck 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题