【问题标题】:Python - unpacking kwargs in local function callPython - 在本地函数调用中解包 kwargs
【发布时间】:2016-10-21 14:15:24
【问题描述】:

我想通过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)

我应该如何纠正这个问题?

【问题讨论】:

    标签: python keyword-argument


    【解决方案1】:

    一些令人困惑的项目:

    您将字典 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,它有两个位置 em> 参数根据您的示例。假设顺序很重要(几乎可以肯定),您需要从要传递的字典中获取正确的值:

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

    【讨论】:

      【解决方案2】:

      第一个问题:你需要像这样传入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,否则函数调用会失败。

      【讨论】:

        【解决方案3】:

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

        要调用带有参数字典的函数,这些仍然需要表示为命名参数。否则,python“认为”提供的参数是位置的

        因此,你应该称你为:

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

        【讨论】:

        • 请注意,这仍然会导致错误,因为他将kwargs 字典传递给last.get_track
        • @agg3l 我试过这个。这给了我TypeError: get_track() takes exactly 3 arguments (2 given)
        • @brianpck 好点,我在示例代码块中错过了这个错误
        猜你喜欢
        • 2012-05-29
        • 1970-01-01
        • 2019-09-05
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 2012-04-09
        • 1970-01-01
        相关资源
        最近更新 更多