Positional arguments (위치 인수)는 함수에 인수를 순서대로 넣는 방식이다.
Keyword arguments (키워드 인수)는 파이썬이 인수의 순서와 용도를 매번 기억하지 않아도 되도록 도와주는 방식이다.
variable length arguments (가변 인수)는 위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 사용된다.
위치인자와 키워드인자 모두 가변인자로 사용할 수 있다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것이다.
- *args
args는 keyword 되지 않은 형태의 정해지지 않은 수의 argument 이다.
정해지지 않았으니 변수 개수와 상관없이 다 받아들일 수 있다.
- **kwargs
kwargs는 keyword가 있는 형태의 정해지지 않은 수의 argument 이다.
args와 기능은 동일하다.
Python에서 함수가 선언될때 parameters의 순서는 다음과 같다:
- Regular positional arguments
- Default arguments
- Variable length positional arguments (*)
- Keyword-only arguments
- Variable length keyword arguments (**)
위의 순서를 지키지 않으면 syntaxError가 뜬다.
non-default parameter보다 default parameter 가 먼저 오면 파이썬 interpreter는 이를 인식하고 syntaxError를 내보낸다.
그리하여 반드시 default parameter는 non-default parameter 뒤에 위치해야한다.
non-default parameter -> default parameter
아래의 코드를 돌렸을 때 왜 에러가 나는 것인지 살펴보도록 하자.
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)
에러 메세지:
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
솔루션:
variable length positional argument 인 *args
가 positional argument 인 age 앞에 위치해있다.
아래와 같이 *args
가 제일 마지막에 오도록 함수를 고치면 아래와 같은 결과를 얻을 수 있다. age가 20살이 되도록 함수를 부를때의 input 위치도 바꾸어주었다.
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", 20, "seoul", "01012341234")
결과:
name=정우성
args=('seoul', '01012341234')
age=20
다음 코드에서의 에러가 왜 일어나는 것인지 알아보자.
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")
에러 메세지:
def func_param_with_kwargs(name, age, **kwargs, address=0):
^
SyntaxError: invalid syntax
솔루션:
default argument 인 address가 variable length keyword argument 인 **kwargs
보다 뒤에 위치해있다. 이 둘의 순서를 고쳐주어야한다.
default값이 있는 address는 positional arguments 인 age, name 보다 뒤에 위치해야한다.
def func_param_with_kwargs(name, age, address=0, **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")
결과:
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
def mixed_params(name="아이유", *args, age, **kwargs, address):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
에러 메세지:
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
솔루션:
위의 문제들과 마찬가지로 argument들의 순서가 잘못되었다.
- Positional argument (age)
- Default argument (name="아이유")
- Variable length positional argument (*args)
- Non-default keyword-only argument (address)
- Variable length keyword argument (**kwargs)
def mixed_params(age, name="아이유", *args, address, **kwargs):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul"
결과:
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul