쓰게 된 이유
파이썬 **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 |