[Python] *args, **kwargs

이동명·2021년 6월 9일
0

파이썬의 함수에 parameter를 전달하는 방법인 variable length positional argument와 variable length keyword argument에 대해 알아보자

1. Variable Length Positional Argument

  • Variable Length라는 말 그대로 변수의 개수가 정해지지 않은 parameter들을 함수에 입력하는 순서에 맞게 전달할 때 사용된다.
  • 함수를 정의할때, parameter앞에 *(asterisk)를 붙여 사용한다.
  • tuple형태로 함수에 전달된다.
- 함수 정의 방법
def function(*args):
- 예시
def print_all(*args):
    print(arg)

print_all("my", "name", "is", "dongmyeong")
- Output
("my", "name", "is", "dongmyeong")

2. Variable Length Keyword Argument

  • Variable Length라는 말 그대로 변수의 개수가 정해지지 않은것에 더해, keyword로 변수를 넘겨야 한다.
  • 함수를 정의할때, parameter앞에 *(asterisk)를 2개 붙여 사용한다.
  • dict 형태로 함수에 전달된다.
- 함수 정의 방법
 def function(**kwargs):
- 예시
 def print_all(*kwargs):
     print(arg)
 
 print_all(name="dongmyeong", position="back-end", age=29)
- Output
{name: "dongmyeong", position: "back-end", age: 29}

3. Keyword-Only Argument & Non-default Keyword-only Argument

  • *args argument는 keyword없이 입력된 parameter를 모두 받기 때문에, 그 뒤에 정의된 parameter를 *args와 구분하기 위해서는 keyword를 통해 parameter를 전달해야한다.
  • *args argument와 구분되며, keyword를 통해 parameter가 전달되기 때문에, *args*kwargs 사이에 위치한다.
  • 이 때, default값이 있으면 Keyword-Only Argument, 없으면 Non-default Keyword-only Argument라 한다.

- 오류 예시 1
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", "01012341234", "seoul", 20)

여기서는 age가 Non-default Keyword-only Argument이다.

- Error Message

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age

- 수정 code
func_param_with_var_args("정우성", "01012341234", "seoul", age=20)

keyword를 통해 parameter 20을 전달했다.


- 오류 예시 2
def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
- Error Message

SyntaxError: invalid syntax

**kwargs가 keyword로 전달되는 parameter를 모두 받기 때문에, keyword-only argument를 **kwargs 뒤에 위치시킬 수 없어 SyntexError가 발생하였다.

- 수정 code
def func_param_with_kwargs(name, age, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

함수에서 address를 삭제하고 **kwargs argument를 통해 mobile과 address를 dict형태로 parameter를 받도록 수정하였다.


- 오류 예시 3
def mixed_params(name="아이유", *args, age, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
 
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
- Error Message

TypeError: mixed_params() missing 1 required keyword-only argument: 'age'

age는 Non-default Keyword-only Argument이기 때문에, age=20 형태로 parameter를 함수에 넘겨줘야 한다.

또한, *args로 넘겨주려는 parameter 뒤에 위치해야 한다.

- 수정 code
mixed_params("정우성", "01012341234", "male" , age=20, mobile="01012341234", address="seoul")

앞에 있던 20을 age라는 keyword와 함께, *args**kwargs 사이에 배치하여 함수에 전달하도록 code를 수정하였다.

0개의 댓글