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)
これをどのように修正すればよいですか?
最初の問題:次のように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)
このようにして、呼び出し元がartist
とtrack
を渡す必要があることを確認します。そうしないと、関数呼び出しは失敗します。
基本的に、関数定義の** kwargsは、名前付き引数を変数にアンパックしてはならないことを意味します。
引数の辞書を使用して関数を呼び出すには、これらを名前付きパラメーターとして表す必要があります。それ以外の場合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
はdictionaryであるため、2つあるlast.get_track
に渡すことはできませんあなたの例によると、positional引数。順序が重要であると仮定すると(ほぼ確実に重要です)、渡される辞書から正しい値を取得する必要があります。
result = last.get_track(kwargs['artist'], kwargs['track'])