def default-first(name = "아이유", age):
return f"{name}, {age}살 입니다."
default-first(28)
위의 경우와 같이 Default Value Parameter를 앞에서 정의하고 뒤에서 positional Arguments를 통해 인수를 받게 되면,
함수를 실행할 때 전달하는 인수(28
)가 첫 번째 인수(name
)인지, 혹은 두 번째 인수(age
)인지 알 수 없게된다.
*args
)의 위치위와 같이 코드를 작성할 경우 func_param_with_var_args() missing 1 required keyword-only argument: 'age'
오류가 발생한다.
위 오류는 키워드 인자로만 전달받을 수 있는 age
가 전달되지 않았다는 뜻이다.
위 오류가 발생하는 원인은 age
인수 앞의 *args
인자로 인해 발생한다.
*args
는 전달받은 변수에서 위치 인수 변수들을 튜플로 묶는 기능을 수행한다. 함수 외부에서 받은 인수가 매개변수에 차례로 복사된 뒤 남은 인수들을 모두 튜플로 묶기 때문에 매개변수 맨 마지막에 위치해야하며, 혹은 *args
이후에 추가적인 매개변수를 사용하기 위해서는 키워드 인수를 활용하여 전달한 인수가 복사될 매개변수를 정확히 알려주어야 한다.
본문의 func_param_with_var_args
함수의 경우 *args
가 name
과 age
매개변수 중간에 사용되었으며, 따라서 age
에 전달할 의도였던 28
까지 *args
에 의해 튜플로 묶여 두 번째 매겨변수로 들어가고, age
에는 아무런 인수도 전달되지 않게 된다.
따라서 위 오류를 수정하기 위해서는
28
이 age
매개변수에 복사되어야 함을 명확히 하기 위해 키워드 인수 (age = 28
)을 활용하거나*args
를 마지막 매개변수로 넣어서 age
와 순서를 바꿀 수 있다.**kwargs
)의 위치위와 같은 코드를 작성할 경우 func_param_with_kwargs() got an unexpected keyword argument 'mobile'
오류가 발생한다. 즉 기존 매개변수에 정의되지 않은 mobile
매개변수가 키워드 인수로써 전달되었다는 뜻이다. 위와 같이 사전에 매개변수에 정의되 이름이 없는데 키워드 변수로 인수를 전달할 경우 오류가 발생하며, 기존에 정의되지 않은 키워드 인수를 자동적으로 매개변수에 넣기 위해서는 가변 키워드 인수(**kwargs
)를 사용해야한다.
위의 함수에서 중간에 들어간 kwargs
를 **kwargs
로 수정할 경우 아래와 같은 결과가 나타난다.
함수의 매개변수를 지정하는 구문에서 address=0
에서 오류가 발생한다. 이는 앞의 가변 키워드 인수가 들어갈 경우, 뒤이어 키워드 인수를 전달받는 매개변수가 올 수 없다는 뜻이다. 이는 앞에서 가변 위치 인수에서 발생한 오류와도 유사한데, **kwargs
를 통해 모든 키워드 인수가 묶이게 되고 뒤이어 오는 키워드 매개변수에는 들어갈 인수가 없어지게 되기 때문이다.
따라서 이 오류를 수정하기 위해서는
address
키워드 인수를 **kwargs
앞으로 옮기거나**kwargs
대신 mobile
을 활용할 수 있다.단, 2번 방법은 함수의 출력 내용에도 수정이 필요해 1번 방법을 좀 더 권장한다.
1번 방법에 의해 함수를 수정한 경우 아래와 같은 출력 결과를 볼 수 있다.
위와 같이 인수를 전달할 때, 기존에 매개변수로 정의되지 않은 mobile
이 중간에 오더라도 함수의 매개변수에서 맨 마지막에 위치한 **kwargs
는 이를 모두 받아온다.
위의 경우 바로 위와 마찬가지로 가변 키워드 인수 (**kwargs
) 뒤에 키워드 인수가 오면서 오류가 발생한다. 이는 바로 위에서 살펴본 것과 두 매개변수의 위치를 바꿈으로써 해결할 수 있다.
위의 오류는 age
에 들어갈 인수가 없어서 발생하는 오류이다. 위의 매개변수를 보면 age
는 *args
뒤에 위치하고, 위에서 보았던 것과 같이 age
를 키워드 인수로 전달하지 않으면 age
매개변수에 아무런 인수를 전달받지 못해 오류가 발생한다. 더불어 함수를 호출하는 구문에서도 age
의 의도로 전달된 20
이 맨 앞의 인수로 등장하므로 함수의 매개변수 순서를 변경할 필요가 있다. 따라서 아래와 같이 코드를 수정하면 오류 없이 결과값이 출력된다.