簡體   English   中英

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意味着命名參數不應該解包為變量。

要使用參數字典調用某些函數,這些函數仍需要表示為命名參數。 其他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_trackskwargs是一個字典,其中的鍵沒有特定的順序,因此在傳入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否則函數調用將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM