2016-10-21 5 views
1

에서 풀고 kwargs로는 나는 dictionary를 전달하고자하는 last.get_track("Radiohead", "Karma Police") 로컬 전화의 올바른 방법이다파이썬 지역 함수 호출

def lastfm_similar_tracks(**kwargs): 

    result = last.get_track(kwargs) 
    st = dict(str(item[0]).split(" - ") for item in result.get_similar()) 
    print (st) 

function.

다음과 같이 호출 :

TypeError: lastfm_similar_tracks() takes exactly 0 arguments (1 given)

가 어떻게이 문제를 해결해야합니다

lastfm_similar_tracks(items) 

을이 오류를 받고 있어요?

답변

1

첫 번째 문제 : 당신이 통과 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) 

이 방법을 사용하면 발신자가 artisttrack 또는 함수 호출이 실패에 통과해야합니다 있는지 확인하십시오.

+0

감사합니다. , 코드를 개선했습니다. –

4

기본적으로 ** 함수 정의에서 kwargs는 명명 된 인수를 변수에 압축 해제하지 말아야 함을 의미합니다.

인수 사전을 사용하여 일부 함수를 호출하려면 명명 된 매개 변수로 이러한 함수를 계속 표현해야합니다. 당신은하지 않고 매개 변수로 사전 items을 전달하는

: 혼란의

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

'kwargs' 사전을'last.get_track'에 전달했기 때문에 여전히 오류가 발생합니다. – brianpck

+0

@ agg3l 저는 이것을 시도했습니다. 이 타입 에러 : get_track()은 정확히 3 개의 인수 (주어진 2 개)를받습니다. –

+0

@brianpck 좋은 점, 샘플 코드 블록에서이 오류가 누락되었습니다. – agg3l

3

몇 가지 항목 : 다른 파이썬 당신은 당신이 함수를 호출한다, 제공된 인수가

따라서 위치로 "고려" 이중 별. 즉, 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']) 
+0

이 시도했지만 ... (** item) –