web-dev-qa-db-ja.com

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
8-Bit Borges

最初の問題:次のようにitemsを渡す必要があります。

lastfm_similar_tracks(**items)

2番目の問題は、lastfm_similar_tracks内で、kwargsが辞書であり、キーの順序が特定されていないため、get_trackに渡すときに順序を保証できません。あなたができる最善のことは:

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

この時点で、コードは意図したとおりに機能するはずです。しかし、私は**kwargsでのlastfm_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を渡す必要があることを確認します。そうしないと、関数呼び出しは失敗します。

1
Hai Vu

基本的に、関数定義の** kwargsは、名前付き引数を変数にアンパックしてはならないことを意味します。

引数の辞書を使用して関数を呼び出すには、これらを名前付きパラメーターとして表す必要があります。それ以外の場合python "considers"は定位置であるために引数を提供しました

したがって、次のように関数を呼び出す必要があります。

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

混乱のいくつかの項目:

辞書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'}

これにより、次の問題が発生します。関数内のkwargsdictionaryであるため、2つあるlast.get_trackに渡すことはできませんあなたの例によると、positional引数。順序が重要であると仮定すると(ほぼ確実に重要です)、渡される辞書から正しい値を取得する必要があります。

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