함수의 변수와 인수는 다음 이미지 한 장으로 요약된다
def print_n_times(value, n=2): for i in range(n): print(value) #함수를 호출 print_n_times("안녕하세요")
쉽게 말해 위의 코드에서 매개변수(parameter)의 순서가
def print_n_times(n=2, value)
이와 같이 바뀌면 어떻게 되는가? 인데....
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)
위 함수를 호출하면 아래와 같은 에러가 뜬다
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
이유는 위치가 1번째로 고정되어 있는 위치 인수 name에는 "정우성"이 할당되지만, 그 뒤에 위치한 개수가 고정되어 있지 않은 가변 인수 *args에 "01012341234", "seoul", 20이 모조리 할당되었기 때문이다.
컴퓨터는 어디서부터 어디까지가 가변인수인지 특정해내지 못하므로
name, 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")
위 함수를 실행하면 invalid syntax 구문오류가 뜬다
2번과 유사한 이유로 생겨나는 문제이므로, 본 함수의 의도대로 가변 키워드 mobile의 순서가 가장 뒤로 이동하여야 한다
따라서 아래와 같이 수정한다def func_param_with_kwargs(name, age, address=0. **kwargs): . . 이하 생략 . func_param_with_kwargs("정우성", "20", address="seoul", mobile="01012341234",)
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")
2번과 3번의 문제가 복합적으로 나타난 형태이다
*args와 **kwargs의 순서를 뒤로 이동하고 함수의 매개변수와 대응되는 인수를 대조하여 일치시켜야한다.def mixed_params(name="아이유", age, address *args, **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, address="seoul", "01012341234", "male" , mobile="01012341234", )