이전에 이 두 개에 대해 포스팅을 했는데, 기본적인 개념만 알고 문제를 풀다보니
응용을 못 해서.. 이건 왜 그러지? 라고 생각했던 것이 생겼다
kwargs는 키워드 인자를 0~N개 까지 유동적으로 받을 수 있는 인자를 말함
딕셔너리 형태의 변수인 'val'은 a, b, c라는 키 값을 가지고 있어서 길이가 3이 나온다.
그래서 val을 aa 함수의 인자로 넣고 실행했더니
'aa() takes 0 positional arguments but 1 was given' 라는 에러가 발생했다.
나는 val이라는 인자를 넣었는데 aa함수는 인자를 0개 받는다고?
여기서 큰 혼란이 왔다.
딕셔너리인데, 딕셔너리가 아닌..이라고 내 맘대로 영작을 해봤다.
kwargs는 key-value를 인수를 받는다고 했다.
그래서 나는 딕셔너리 형태의 변수인 val을 선언했고, 왜 오류가 나는 것이지?
정답은 이 문구에 있다
kwargs는 key-value 형태의 인수를 받은 뒤, dictionary 함수로 전해지게 됩니다.
즉, 최초에 인자를 넣을 때, 딕셔너리 형태처럼 key-value로 설정해주지만,
아직은 딕셔너리 형태가 아니라는 것
인자들을 다 모아 함수로 전해질 때, 딕셔너리 형태가 된다는 것이다.
딕셔너리에서 키 값이 String형태라면 ' ' 를 써준다.
dic = {'name'='ky'} 같이..
그런데 kwargs는 키 값에 ' '를 붙이지 않는다.
표현이 잘못되었고 혹시 너가 의도한 건 'name'=='ky'니? 라고 묻고 있다.
나는 'ky'를 대입하려는 것이기 때문에 = 가 맞는데..
처음에는 당연히 문자열 형태니 ' '를 써야지 했는데, kwargs에서는 그냥 쓴다는 것!
그래서 name에 ' '를 없애고 실행했더니 잘 되는 걸 확인할 수 있었다.
args도 kwargs처럼 인자를 0~N개까지 받는데, 다만 key-value형태가 아닌 value형태로 받는 걸 말함
마찬가지로 args 역시 길이가 이상하게(내 기준에는 이상했음) 나와서 직접 출력해보며 확인을 했다.
val 이라는 변수에는 1,2,3,4,'a'라는 5개의 변수를 설정했고,
인자 받은 거를 for문을 돌려 직접 값을 출력 후 길이를 출력해봤다.
그런데, len(args) == 1 이라는 걸 보고 의문이 들었다.
그래서 val의 인수를 직접 함수에 대입하여 실행하였다.
그랬더니, 1,2,3,4,'a'가 출력이 되면서 길이가 5라고 찍혔다.
둘의 차이를 동시에 출력해보며 비교했는데, 차이가 확 보이게 되었다.
같은 개수의 인자라도 하나의 변수로 묶어서 보내줬기 때문에 길이가 1이 나오고 출력도 한 개로 됐던 것이었다.
당연한 말이지만 키워드는 kwargs를 쓰기 때문에 여기서는 쓸 수 없다
보다시피, 예기치않은 키워드 인수 'name'을 받았다는 오류가 친절하게 뜬다!