본문 바로가기

Python

파이썬 함수 인자 *arg와 **kwargs

오늘은 파이썬 함수 인자인 *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 마스터 클래스 강의