[英]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意味着命名參數不應該解包為變量。
要使用參數字典調用某些函數,這些函數仍需要表示為命名參數。 其他python“考慮”提供的參數是位置的
因此,您應該將您的功能稱為:
items = {"artist": "Radiohead", "track": "Karma Police"}
lastfm_similar_tracks(**items)
一些混亂的事項:
您將字典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'])
第一個問題:您需要像這樣傳遞items
:
lastfm_similar_tracks(**items)
第二個問題,在lastfm_similar_tracks
, kwargs
是一個字典,其中的鍵沒有特定的順序,因此在傳入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
否則函數調用將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.