본문 바로가기

개발

[Python] 키워드 인자에서 **kwargs 주의점

쓰게 된 이유

파이썬 **kwargs, *args이라 검색만 해도 관련 내용이 많이 나온다.

하지만 키워드 인자를 사용한 예시는 내 기준 구글 1~2페이지에선 보이지 않았고 다 비슷한 내용들이었다.

개념만 슥 보고 넘어가기엔 이후에 팀원들도 같은 실수를 할 수 있다 생각해서 공유하기 전에 생각을 정리하기로 했다.

 

급한 분들을 위해 요약하면

**kwargs에 키워드 인자를 사용하면 키워드 인자도 딕셔너리에 들어간다

**kwargs

인수를 딕셔너리 형태로 만든다.

하지만 키워드 인자처럼 사용하면 이런 결과가 나온다.

def test1(**kwargs):
    print(kwargs)
    pass

data = {'A': 1, 'B': 2}
test1(kwargs=data)

결과

{'kwargs': {'A': 1, 'B': 2}}

왜 이런 걸까?

변수 data kwargs 매개변수에 언팩(A=1, B=2) 되는 것이 아니라 kwargs라는 하나의 인자로 전달된다.

그래서 **kwargs에서 언팩 되지 않고 이것을 딕셔너리 형태로 받는다. ( *.*kwargs 와 kwargs는 다른 거다.)

따라서 {'A': 1, 'B': 2} 가 아닌 {'kwargs': {'A': 1, 'B': 2}} 가 출력된다.

*args와 조합하면?

args도 마찬가지로 키워드 인자로 쓴 args와 test1 매개변수인 *args는 다른 거다.

따라서, args='a'는 **kwargs로 전달된다.

def test1(*args, **kwargs):
    print(f'args = {args}')
    print(f'kwargs = {kwargs}')
    pass

data = {'A': 1, 'B': 2}
test1(args='a', kwargs=data)

결과

args = ()
kwargs = {'args': 'a', 'kwargs': {'A': 1, 'B': 2}}

함수 호출과 정의 단에서 동작 정리

함수 정의(= def test1(**kwargs) ): 인자들을 딕셔너리로 패킹

함수 호출(= test2(**kwargs) ): 딕셔너리를 키워드 인자들로 언패킹

def test1(**kwargs):          # 1
    print(f'test1: {kwargs}') # 2
    test2(**kwargs)           # 3

def test2(**kwargs):          # 4
    print(f'test2: {kwargs}') # 5

data = {'A': 1, 'B': 2}
test1(kwargs=data)

결과

test1: {'kwargs': {'A': 1, 'B': 2}}
test2: {'kwargs': {'A': 1, 'B': 2}}

#1: kwargs = {'A': 1, 'B': 2} 인자를 딕셔너리 형태로 패킹

#2: 딕셔너리로 패킹된 kwargs를 출력

#3: 딕셔너리로 패킹된 kwargs를 키워드 인자들로 언팩

#4: #1과 같음

#5: #2와 같음

'개발' 카테고리의 다른 글

proxyBeanMethods=false를 써야 하는지  (0) 2024.07.21
[Java] 토큰 인증 처리에 대한 정리  (0) 2024.05.18
리눅스 환경에서 버전 관리  (0) 2024.03.03
서버에서 rm 실수를 줄일만한 방법  (0) 2024.02.28
redis 2.0 분석  (0) 2023.12.20