본문 바로가기
Data Engineering/파이썬

파이썬 *args, **kwargs (파이썬 클린 코드 #4)

by 무언가 하는 소소 2022. 10. 18.
728x90
반응형

 

 

전편

 

 

 

파이썬 *args, **kwargs란?

파이썬 코드를 보다보면 함수 정의의 파라미터 부분에서 *args, **kwargs를 쓰는 것을 볼 수 있다. 또 해당 함수를 호출 할 때는 아규먼트에 *, ** 연산자를 쓰는 것도 자주 볼 수 있다. 이번 포스팅에서는 *args, **kwargs가 도대체 무엇인지 알아보자. 

 

 

1. *args

함수 파라미터에 *args를 쓰면 임의의 개수의 파라미터를 넘겨받을 수 있다. 즉, 아래와 같은 코드가 가능하다. 

def func(*args):
  for arg in args:
    print(arg)

# 함수 호출
func('인자1', '인자2', 1, 2)

 

여기서 유의할 점은 함수가 임의의 개수의 파라미터를 받을 수 있게 해주는 연산자는 *이고, 뒤에 args는 그냥 파라미터 이름이다. 따라서 args는 아래 예시처럼 원하는 이름으로 바꿔도 된다. 하지만 보통은 *args를 쓰는 것이 관습이다.

def func(*params):
  for param in params:
    print(param)

 

*args에 대해서는 이정도로만 알고가도 실제로 함수를  작성하는데는 문제가 없다. 하지만 가끔 이해가지 않는 코드가 생길 것이다. 아래 코드를 보자. 아래 함수의 출력은 무엇일까?

def func(*args):
  print(*args)

# 함수 호출
func('인자1', '인자2', 1, 2)

 

사실 * 연산자는 함수의 파라미터 부분에서 쓰면 packing을 하고 아규먼트 부분(함수 호출)에서 쓰면 unpacking을 해주는 연산자다. 위의 코드에서 func()를 부를 때 세개의  문자열 인자가 * 연산자에 의해 args라는 파라미터로 packing된다. 따라서 위의 코드에서 args==['인자1', '인자2', 1, 2]다. 

또한 print() 함수의 호출 부분에서는  *에 의해 args의 내용물이 unpacking된다. 즉, 위의 코드에서 print(*args)는 print('인자1', '인자2', 1, 2)와 같다. 

# args == ['인자1', '인자2', 1, 2] 
def func(*args):
 #print('인자1', '인자2', 1, 2)
 print(*args)

# 함수 호출
func('인자1', '인자2', 1, 2)

 

2. **kwargs

**kwargs는 mapping 데이터를 다룬다는 것 외에는 *args랑 동일하다. Mapping 데이터는 쉽게 말해서 딕셔너리 같이 key-value 페어로 된 데이터라고 생각하면 된다. 아래 코드 예시가 있다.  

def func(**kwargs):
  if len(kwargs) == 1:
  	print(kwargs['first_arg'])
  else:
  	print(kwargs['first_arg'])
    print(kwargs['second_arg'])

# 함수 호출
func({'first_arg': 1, 'second_arg': 2})

 

 

3. *args, **kwargs 활용:  Wrapper 함수

*args와 **kwargs를 활용하는 대표적 예시는 wrapper 함수다.  wrapper 함수는 함수의 내부에서 다른 함수를 호출한다. 이때 함수를 호출하며 아규먼트를 전달하기 위해 *args와 **kwargs가 사용된다. 아래 예시코드는 전달받은 문자열을 모두 소문자로 바꾼 후에 출력하는 함수이다. 

def printLower(*args, **kwargs):
  args = list(args)
  for i, value in enumerate(args):
    args[i] = str(value).lower()
  return print(*args, **kwargs)

printLower('Hello,', 'Cindy')
>> hello, cindy

printLower('DOG', 'CAT', 'MOOSE', sep=', ')
>> dog, cat, moose
728x90
반응형

댓글