함수를 정의할 때 매개변수를 어떤 형식과 순서로 지정하느냐에 따라서 함수를 호출할 때 입력하는 인자값이 달라질 수 있다. 그리고 파이썬에서 매개변수를 입력하는 순서는 정해져 있다. 바로 다음과 같다!
예를 들어 위 순서에 맞게 def func(a, b="Hello", *args, c, **Kwargs)
라는 함수를 정의해보자.
자, 여기에서 주목해서 보아야 할 부분은 키워드 인자이다. 함수를 정의할 때는 c
로 위치 인자인 a
와 다를 바 없어보인다. 하지만 가변 인자인 *args
뒤에 위치해있다는 점이 중요하다. 가변 인자 뒤에 위치한 인자들은 c=value
와 같이 키워드 인자로 호출해야 한다.
안 된다. 왜냐하면 위에서 언급한 바와 같이 *arg
뒤에 위치해있기 때문이다. 가변인자 *args
는 뒤에 나오는 모든 값들을 자신의 것으로 빨아들이기 때문에 c=value
와 같이 키워드와 값을 묶어서 value
가 c
의 것임을 알려주어야 한다.
가변 인자가 등장하면 나머지 인자는 키워드 인자를 통해서만 전달될 수 있다. 키워드 전용 인자이라는 의미에서 영어로는 keyword only argument라고 한다.
또한, 키워드 인자에도 기본값(default)를 지정할 수 있다. 기본값을 지정하면 함수를 호출할 때 인자를 넘겨주지 않아도 에러가 나지 않는다.
기본값이 없으면 함수를 호출할 때 인자를 아예 전달하지 않거나 키워드 없이 값만 전달한다면 에러가 난다. 이를 방지하기 위해 기본값을 지정하는 것이다.
순서는 상관없다. 왜냐하면 얘네들은 위치인자가 아니라 키워드 인자이기 때문이다. 매개변수에 기본값이 없다면 호출할 때 키워드도 명시해야 하기 때문에 구분할 수 있다.
하지만, 위치 인자의 경우는 다르다! 기본값이 있는 경우가 뒤에 나와야 한다. 기본값 매개변수가 앞에 있으면 함수를 호출할 때 어떤 매개변수를 생략한 것인지 알 수 없게 되기 때문이다.
하지만 가변 인자 다음에 키워드 인자만 가능하다고 해서 다른 곳에서 키워드 인자를 쓰지 말라는 법은 없다. 원래 위치 인자의 자리를 /
로 구분하면 앞 쪽은 위치 인자 뒤 쪽은 키워드 인자가 사용할 수 있다. 아래의 그림을 참고하면 이해가 쉬울 것이다.
몇 가지 예제를 보면서 에러를 발생시키는 부분을 수정해보자.
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)
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", age=20)
*args
뒤에 있는 age
는 키워드 전용 인자이다. 호출 시 20
대신 age=20
으로 변경하였다. 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, "01012341234", "seoul")
age
를 *args
앞으로 옮겨 위치 인자로 사용했다.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, 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")
**kwargs
는 뒤에는 어떤 인자도 위치할 수 없다. 함수 정의 시 **kwargs
가 맨 마지막으로 이동해야 한다. 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(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")
age
를 맨 앞으로 옮겼다. (위치 인자로 사용)address
를 **kwargs
앞으로 옮겼다. (키워드 전용 인자로 사용)참고사이트 :
Python keyword only arguments
5 Types of Arguments in Python Function Definition
TIL 3.(replit3.) 파이썬의 함수와 keyword-only arguments
Forcing the use of named parameters