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)
这样,您确保调用者必须传入 artist
和 track
,否则函数调用将失败。
我想传一个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)
这样,您确保调用者必须传入 artist
和 track
,否则函数调用将失败。