오늘은 파이썬 함수 인자인 *arg와 **kwargs이 왜 필요한지, 그리고 어떻게 사용하는지에 대해 알아보도록 하겠다.
일반적으로 파이썬 함수를 작성할 때, 아래와 같이 파라미터 개수를 지정해서 넘겨준다.
def sample_func(name, sex):
print(f'제 이름은 {name}이고, 성별은 {sex}입니다.')
sample_func('brian', 'man')
# 출력 결과
# 제 이름은 brian이고, 성별은 man입니다.
그런데 만약 호출하는 로직에서 몇 개의 파라미터를 넘겨줘야 할지 모르는 경우, 혹은 선택적으로 변수를 받을 수도 있는 경우에는 파라미터를 어떻게 지정해줘야 할까?
바로 이러한 경우에 사용하는 것이 *arg와 **kwargs 인자이다!
파이썬 함수 인자 *args에 대해 먼저 살펴보면, 아래와 같은 특징들이 있다.
- args로 들어온 값은 튜플(tuple)로 저장된다.
- args에서 값을 꺼낼 때는 인덱스(index)를 이용한다. (ex. args[0], args[1])
- args라는 이름 외 다른 이름으로 받아와도 된다. (ex. some_func(*kk):) → 권장하지는 않음
def sample_func(name, sex, *args):
print(type(args)) # 튜플(tuple) 타입으로 값을 반환
country = args[0] if len(args) >= 1 else None # args 인자에 들어온 값이 있는 경우에만 값 추출
city = args[1] if len(args) >= 2 else None # args 인자에 들어온 값이 있는 경우에만 값 추출
# 예시1) name에 'brian', sex에 'man'이 들어감
sample_func('brian', 'man')
# 예시1) name에 'cristal', sex에 'woman', args에 ('korea', 'seoul')이 들어감
sample_func('cristal', 'woman', 'korea', 'seoul')
다음으로 **kwargs 함수 인자에 대해 살펴보자.
- kwargs로 들어온 값은 딕셔너리(dictionary)로 저장된다.
- kwargs에서 값을 꺼낼 때는 get() 메서드를 이용한다. (ex. dict.get('name'))
- 만약 딕셔너리(dictionary)에서 dict['name'] 시도 시, 'name'이라는 키(key)가 없을 때 에러가 발생한다.
- 반면에 dict.get('name') 이런 식으로 get() 메서드를 이용해서 시도하면, 'name'이라는 키(key)가 없어도 에러가 나지 않고 None 값이 반환되어 상대적으로 안전하다.
def sample_func(**kwargs):
print(type(kwargs)) # 딕셔너리(dictionary) 타입 반환
print(kwargs) # ex) kwargs = {'name': 'brian', sex: 'man'}
name = kwargs.get('name') or '' # 'name'이라는 키(key)가 있으면 값(value)을 꺼내오고, 없으면 빈 문자열('') 반환
country = kwargs.get('country') or '' # 'name'이라는 키(key)가 있으면 값(value)을 꺼내오고, 없으면 빈 문자열('') 반환
print(f'name: {name}, country: {country}')
# 아래와 같이 특정 값(value)이 어느 키(key)에 해당하는지 지정해줘야 함
sample_func(name = 'brian', country = 'korea')
그렇다면 파이썬 함수 인자 *args와 **kwargs를 같이 사용해도 될까? 이에 대한 답은 당연히 "Yes"이다.
아래의 예시와 같이 두 함수 인자를 함께 사용할 수도 있다!
def sample_func(name, sex, *args, **kwargs):
print(name)
print(sex)
print(args)
print(kwargs)
sample_func('brian', 'man', 'korea', 'seoul', phone = '010-1234-5678', email = 'brian@hanmail.net')
# 각 변수에 들어가 있는 값은 아래와 같음
# name = 'brian'
# sex = 'man'
# args = ('korea', 'seoul') # 튜프(tuple) 형태
# kwargs = {'phone': '010-1234-5678', 'email': 'brian@hanmail.net'} # 딕셔너리(dictionary) 형태
여기까지 해서 활용도가 높은 파이썬 함수 인자 *args와 **kwargs에 대해 알아보았다.
나 또한 파이썬 함수를 작성할 때, 파라미터 개수를 사전에 지정해서 넘겨주는 방식을 많이 사용했는데 *args와 **kwargs를 이용해서 함수를 작성하면 코드의 유연성이 더 높아질 것 같다.
<Reference>
- 김현진님의 인프런 Airflow 마스터 클래스 강의
'Python' 카테고리의 다른 글
[Python Skill Up] 고급 리스트 기능 (0) | 2023.06.14 |
---|---|
[Python Skill Up] 자리 맞춤 메서드 (0) | 2023.06.07 |
[KoNLPy 설치] Window10에서 KoNLPy 설치하기 (feat. 이제 삽질은 그만!! ^^) (6) | 2020.11.13 |
[알고리즘_Programmers] 9주차 2번 문제 및 풀이 (0) | 2020.06.17 |
[알고리즘_Programmers] 9주차 1번 문제 및 풀이 (0) | 2020.06.16 |