본문 바로가기

Python/Python 용어 정리

*args와 **kwargs

파이썬을 쓰면서 여러 가지 문서를 보다 보면 빠지지 않고 항상 나오는 것이 

*args와 **kwargs이다. 이것들은 과연 무엇일까?

 

일단 단어 뜻부터 알아보자. args는 arguments(인자들)이란 뜻이고, 

kwargs는 keyword arguments(키워드 된 인자들)이란 뜻이다. 물론 keyword 말고도 named라고도 한다.


*args는 positional argument, *kwargs는 keyword argument가 정식 명칭이며 중요한 점은 args와 kwargs는 그냥 관용적으로 사용하는 이름일 뿐 *p, **k와 같이 이름을 다르게 해도 상관없다. 그러면 이러한 것들은 어떻게 사용하는 것일까?

def func1(arg1, arg2):
  print('arg1: {}'.format(arg1))
  print('arg2: {}'.format(arg2))

func1('hello', 123)
arg1: hello
arg2: 123

위와 같이 결과가 나오게 된다.

너무나 당연한 것이다. 일단 중요한 것은 func1의 arg1, arg2는 keyword argument이다.

그러면 이제 *args에 대해서 알아보자.

 

def func2(arg1, arg2, *args):
  print(arg1, arg2)
  print( type(args) )
  print( len(args) )
  print(args)

def func3(*args):
  print( type(args) )
  print( len(args) )
  print(args)

func2('hello', 123, 'a', 'b', 'c', 1, 2, 3)
print('\n----------\n')
func3('hello', 123, 'a', 'b', 'c', 1, 2, 3)
hello 123
<class 'tuple'>
6
('a', 'b', 'c', 1, 2, 3)

----------

<class 'tuple'>
8
('hello', 123, 'a', 'b', 'c', 1, 2, 3)

 

그냥 보면 바로 이해할 것이다.
함수를 정의할 때 있지 않던 매개변수가 인자로 넘어오게 되면 모두 args tuple이 돼서 넘어간다.
참고로 얘기하면 매개변수(parameter)는 함수를 정의할 때 변수를 부르는 말이고

인자(argument)는 함수를 호출할 때 매개변수 자리에 넘기는 변수를 의미한다.
func2와 func3을 보면 좀 더 확실해진다.

 

 

 

이제 **kwargs를 알아보자.

def func4(arg, *args, **kwargs):
  print('arg: {}'.format(arg))
  print( len(args) )
  print(args)
  print( type(kwargs) )
  print(kwargs)

func4('hello', 'a', 'b', 1, 2, 'abc')
print('\n----------\n')
func4(1, 2, 3, some='value', kim='sooran')
arg: hello
5
('a', 'b', 1, 2, 'abc')
<class 'dict'>
{}

----------

arg: 1
2
(2, 3)
<class 'dict'>
{'some': 'value', 'kim': 'sooran'}

 

위에서 보면 알겠지만 함수를 호출할 때 그냥 일반적인 방법으로 인자를 넘기면 kwargs에는 아무것도 들어가지 않는다.

또한 kwargs는 dictionary라는 사실을 알 수 있다.
원래 keyword argument란 것이 python 함수 호출시 인자를 파라미터가 정의된 순서대로 넘기는 것이 아니라 원하는 인자만 선택해서 넘길 때 사용한다.

그런데 만약 함수 정의에 없는 파라미터가 키워드 돼서 인자로 넘어오면 kwargs 사전에 들어가서 넘어가게 된다.

 

중요한 점은 만약 *args와 **kwargs를 사용할 때는 반드시 순서를 지켜서 넘겨줘야 한다.
func4('first', arg='apple', 3, 4, b='bee')
이런 식으로 호출하면 순서에 대한 에러가 나게 된다.

 

마지막으로 *args와 **kwargs가 정의된 함수에 변수로 사용하던 리스트나 딕셔너리를 넘기는 방법을 알아보자.

여기서 주의할 점은 아래의 방법은 '이렇게도 할 수 있다.'이지  '이러려고 사용한다.'가 아니다.

def func5(*args, **kwargs):
  print( len(args) )
  print(args)
  print( len(kwargs) )
  print(kwargs)

items = ['hello', 'hi', 'kim']
bank = { 'kim': 10000, 'lee': 500, 'hong': 1200 }

func5(*items, **bank)
3
('hello', 'hi', 'kim')
3
{'kim': 10000, 'lee': 500, 'hong': 1200}

 

이렇게 여러 python 문서에서 볼 수 있는 *args와 **kwargs에 대해서 알아봤다.

'Python > Python 용어 정리' 카테고리의 다른 글

sorted( ) 함수  (0) 2022.07.21
배열의 축(axis) 이해하기  (0) 2022.07.12
고유값(eigenvalue), 고유벡터(eigenvector) 의 정의  (0) 2022.07.12
Norm, 노름  (0) 2022.07.12
벡터란 무엇인가?  (0) 2022.07.12