Answer
def example(arg1, arg2, arg=none, arg="value", arg=[], *arg, **arg)
positional parameter (arg1, arg2)
optional parameter (arg=none)
keyword parameter (arg="value")
list parameter (arg=[])
keyword-only (*arg)
var-keyword parameter (**arg)
위와 같이 파이썬 함수에서는 arguments들을 처리하는 순서가 미리 정해 있습니다. 그렇기 때문에 아래와 같이 default value parameter를 non-default value parameter 앞에 정의하게 되면 syntaxError가 납니다. 예를 들어 love_you 함수 호출 시 position arg를 먼저 받아오는 과정에서 이미 my_name에 default 값으로 정의 되어 있는 "정우성" 때문에 갈 자리를 잃고 error가 나는 것입니다.
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
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)
문제 해결방법
이 코드를 실행하면 일단 name = 정우성 까지는 정상적으로 작동이 됩니다 하지만 두번째 parameter에 있는 *args인 가변 인수 위치 때문에 에러가 나게 됩니다. variable length arguments는 가변의 길이를 받는 인자임으로 번호,도시까지만 받도록 코딩하였지만 자연스럽게 숫자 20까지 함께 들어가게 되어 age값을 정의할 수 없게 되면서 오류가 나는 것입니다.
이를 해결하기 위해서 age 값을 age =20로 keyword를 정의해줘야 합니다. 아래는 해결 후 호출 된 결과 값 입니다.
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)
name=정우성
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")
문제해결방법
현재 arguments의 순서를 보면
1. non-default posit
2. non-default posit
3. var-keyword parameter
4. default keyword
이다 그렇기 때문에 3번과 4번의 위치를 바꾸면 함수가 인수를 호출 하는 순서를 맞추며 결과가 정상적으로 출력되는 것을 볼 수 있습니다.
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")
문제해결방법
https://getkt.com/wp-content/uploads/2019/02/python-function-definition-arguments-kind-and-order.jpg
위의 그림을 보면 age는 position argument, name=아이유는 defalut argument, *args는 variable length positional arguments, address는 keyword-only arguments 마지막으로 **kwargs는 variable length keyword agruments입니다. 그래서 parameter의 호출 순서에 맞게 정렬 한다음 keyword들의 자리도 적절하게 변경해주면 아래와 같은 답이 출력 됩니다.
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