함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유가 무엇인지 생각해보자!
→ 답:Arguments의 우선순위가 존재한다!
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)
다시 함수로 돌아가서 *args가 가변인자를 받는 변수임으로 뒤에 age가 non-default value parameter로 인식이되어서 오류가 발생하게 된다.
그러므로 "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)
다시 함수로 돌아가서 positional과 keyword 인수의 관계 때문에 문제가 발생하게된다.
그러므로 address와 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")
#함수 정의부의 **kwargs
를 가리키며 문법 에러라고 알림
그래서 수정을 positional에 맞게 하였습니다.
def mixed_params(age, address, name="아이유", *args, **kwargs): #참고한 파이썬 argument order를 참고
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)
※정리※