TIL26 - len(**kwargs) & len(*args)

Kiyong Lee·2021년 9월 6일
0

Python from wecode

목록 보기
6/6

kwargs & args

이전에 이 두 개에 대해 포스팅을 했는데, 기본적인 개념만 알고 문제를 풀다보니
응용을 못 해서.. 이건 왜 그러지? 라고 생각했던 것이 생겼다


kwargs란?

kwargs는 키워드 인자를 0~N개 까지 유동적으로 받을 수 있는 인자를 말함


이 글을 쓰는 이유

딕셔너리 형태의 변수인 'val'은 a, b, c라는 키 값을 가지고 있어서 길이가 3이 나온다.

그래서 val을 aa 함수의 인자로 넣고 실행했더니

'aa() takes 0 positional arguments but 1 was given' 라는 에러가 발생했다.

나는 val이라는 인자를 넣었는데 aa함수는 인자를 0개 받는다고?

여기서 큰 혼란이 왔다.


dictionary, Not dictionary

딕셔너리인데, 딕셔너리가 아닌..이라고 내 맘대로 영작을 해봤다.

kwargs는 key-value를 인수를 받는다고 했다.

그래서 나는 딕셔너리 형태의 변수인 val을 선언했고, 왜 오류가 나는 것이지?

정답은 이 문구에 있다

kwargs는 key-value 형태의 인수를 받은 뒤, dictionary 함수로 전해지게 됩니다.

즉, 최초에 인자를 넣을 때, 딕셔너리 형태처럼 key-value로 설정해주지만,
아직은 딕셔너리 형태가 아니라는 것

인자들을 다 모아 함수로 전해질 때, 딕셔너리 형태가 된다는 것이다.


key값에 ' ' ?

딕셔너리에서 키 값이 String형태라면 ' ' 를 써준다.

dic = {'name'='ky'} 같이..

그런데 kwargs는 키 값에 ' '를 붙이지 않는다.

표현이 잘못되었고 혹시 너가 의도한 건 'name'=='ky'니? 라고 묻고 있다.

나는 'ky'를 대입하려는 것이기 때문에 = 가 맞는데..

처음에는 당연히 문자열 형태니 ' '를 써야지 했는데, kwargs에서는 그냥 쓴다는 것!

그래서 name에 ' '를 없애고 실행했더니 잘 되는 걸 확인할 수 있었다.


args

args도 kwargs처럼 인자를 0~N개까지 받는데, 다만 key-value형태가 아닌 value형태로 받는 걸 말함


len = 1 ?

마찬가지로 args 역시 길이가 이상하게(내 기준에는 이상했음) 나와서 직접 출력해보며 확인을 했다.

val 이라는 변수에는 1,2,3,4,'a'라는 5개의 변수를 설정했고,
인자 받은 거를 for문을 돌려 직접 값을 출력 후 길이를 출력해봤다.

그런데, len(args) == 1 이라는 걸 보고 의문이 들었다.


len = n

그래서 val의 인수를 직접 함수에 대입하여 실행하였다.

그랬더니, 1,2,3,4,'a'가 출력이 되면서 길이가 5라고 찍혔다.

둘의 차이를 동시에 출력해보며 비교했는데, 차이가 확 보이게 되었다.

같은 개수의 인자라도 하나의 변수로 묶어서 보내줬기 때문에 길이가 1이 나오고 출력도 한 개로 됐던 것이었다.


not keyword

당연한 말이지만 키워드는 kwargs를 쓰기 때문에 여기서는 쓸 수 없다

보다시피, 예기치않은 키워드 인수 'name'을 받았다는 오류가 친절하게 뜬다!

profile
ISTJ인 K-개발자

0개의 댓글