def love_you(my_name = "정우성", your_name):
print(f"{my_name} loves {your_name}")
# 결괏값
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
your_name
의 순서가 default value parameter인 my_name = "정우성"
보다 앞서야 한다. def love_you(your_name, my_name = "정우성"):
print(f"{my_name} loves {your_name}")
my_name
의 값으로 새로운 값을 지정하는 대신, default 값을 그대로 사용하기로 했다고 가정해보자. 이 경우 함수의 인수로 my_name
에 대한 인수 값은 생략한 채, your_name
에 대한 인수 값만 넘겨주면 된다. 아래의 예시처럼 말이다. def love_you(your_name, my_name = "정우성"):
print(f"{my_name} loves {your_name}")
love_you('브브걸') # 결괏값: 정우성 loves 브브걸
your_name
의 인수로 입력한 '브브걸'
이 my_name
의 인수로 인식되는 난감한 상황이 연출될 것이다. 이처럼 인수와 parameter가 정확한 짝을 이루도록 하기 위해 default value parameter와 non-default value 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)
# 결괏값: TypeError: func_param_with_var_args() missing 1 required keyword-only argument: age'
age
와 짝을 이루는 인수 값이 없기 때문이다. 해결 방법엔 두 가지가 있다.첫 번째 해결 방법은 위치 인수(positional arguments) 20
과 가변 인수 "01012341234", "seoul"
의 순서를 바꿔주는 것이다. 우선 위치 인수와 가변 인수의 개념을 살펴보면 다음과 같다.
위치 인수: 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미하며, 가장 자주 사용되는 방식입니다.
가변 인수: 가변 인수란 인수의 개수가 변할 수 있다는 의미이며, 가변 인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미합니다.
위치 인수의 입력 순서가 가변 인수보다 앞서야, parameter와 arguments가 정확하게 짝을 이룰 수 있어서 두 인수의 순서를 바꿔주도록 한다. 더불어 바뀐 인수의 순서와 일치할 수 있도록, parmeter의 순서도 함께 조정해준다.
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")
# 결괏값:
# name=정우성
# args=('01012341234', 'seoul')
# age=20
age
를 키워드 인수로 표현해주는 것이다. 키워드 인수의 순서는 가변 인수 뒤에 위치하기 때문에, 순서를 바꿀 필요 없이 인수의 표현 형식만 바꿔주면 문제 해결이 가능하다. 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)
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")
# 결괏값: SyntaxError: invalid syntax
함수는 SyntaxError를 반환하고 있다. error의 원인은 가변 키워드 인수와 관련 있다. 함수 호출 코드 func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
를 살펴보면, 가변 키워드 인수 mobile="01012341234"
가 키워드 인수address="seoul"
보다 앞서 위치해 있다. 우선 두 인수의 순서를 바꿔줘야 한다.
문제의 또 다른 원인은 parameter에 있다. 키워드 가변 인수가 짝을 이루려면, parameter의 입력 순서도 인수와 일치시켜야 한다.
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", address="seoul", mobile="01012341234")
# 결괎값
# 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")
결괏값: SyntaxError: invalid syntax
address="seoul"
을 가변인수 "01012341234", "male"
뒤로 옮겨준다. 당연히 parameter의 순서도 인수와 동일해야 하므로 address
를 *args
뒤로 옮겨 준다. 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",address="seoul" ,mobile="01012341234")
# 결괏값:
# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul