[Python] Function Arguments

jaylight·2020년 11월 19일
0
post-thumbnail

Default Value Parameter가 Non-default Value Parameter보다 앞에 오면 안되는 이유

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 함수의 경우 *argsnameage 매개변수 중간에 사용되었으며, 따라서 age에 전달할 의도였던 28까지 *args에 의해 튜플로 묶여 두 번째 매겨변수로 들어가고, age에는 아무런 인수도 전달되지 않게 된다.

따라서 위 오류를 수정하기 위해서는

  1. 28age 매개변수에 복사되어야 함을 명확히 하기 위해 키워드 인수 (age = 28)을 활용하거나
  2. *args를 마지막 매개변수로 넣어서 age와 순서를 바꿀 수 있다.

가변 키워드 인수(**kwargs)의 위치

위와 같은 코드를 작성할 경우 func_param_with_kwargs() got an unexpected keyword argument 'mobile'오류가 발생한다. 즉 기존 매개변수에 정의되지 않은 mobile 매개변수가 키워드 인수로써 전달되었다는 뜻이다. 위와 같이 사전에 매개변수에 정의되 이름이 없는데 키워드 변수로 인수를 전달할 경우 오류가 발생하며, 기존에 정의되지 않은 키워드 인수를 자동적으로 매개변수에 넣기 위해서는 가변 키워드 인수(**kwargs)를 사용해야한다.

위의 함수에서 중간에 들어간 kwargs**kwargs로 수정할 경우 아래와 같은 결과가 나타난다.

함수의 매개변수를 지정하는 구문에서 address=0에서 오류가 발생한다. 이는 앞의 가변 키워드 인수가 들어갈 경우, 뒤이어 키워드 인수를 전달받는 매개변수가 올 수 없다는 뜻이다. 이는 앞에서 가변 위치 인수에서 발생한 오류와도 유사한데, **kwargs를 통해 모든 키워드 인수가 묶이게 되고 뒤이어 오는 키워드 매개변수에는 들어갈 인수가 없어지게 되기 때문이다.

따라서 이 오류를 수정하기 위해서는

  1. address 키워드 인수를 **kwargs 앞으로 옮기거나
  2. 앞에서 **kwargs 대신 mobile을 활용할 수 있다.

단, 2번 방법은 함수의 출력 내용에도 수정이 필요해 1번 방법을 좀 더 권장한다.

1번 방법에 의해 함수를 수정한 경우 아래와 같은 출력 결과를 볼 수 있다.

위와 같이 인수를 전달할 때, 기존에 매개변수로 정의되지 않은 mobile이 중간에 오더라도 함수의 매개변수에서 맨 마지막에 위치한 **kwargs는 이를 모두 받아온다.

인수 순서

위의 경우 바로 위와 마찬가지로 가변 키워드 인수 (**kwargs) 뒤에 키워드 인수가 오면서 오류가 발생한다. 이는 바로 위에서 살펴본 것과 두 매개변수의 위치를 바꿈으로써 해결할 수 있다.

위의 오류는 age에 들어갈 인수가 없어서 발생하는 오류이다. 위의 매개변수를 보면 age*args 뒤에 위치하고, 위에서 보았던 것과 같이 age를 키워드 인수로 전달하지 않으면 age 매개변수에 아무런 인수를 전달받지 못해 오류가 발생한다. 더불어 함수를 호출하는 구문에서도 age의 의도로 전달된 20이 맨 앞의 인수로 등장하므로 함수의 매개변수 순서를 변경할 필요가 있다. 따라서 아래와 같이 코드를 수정하면 오류 없이 결과값이 출력된다.

0개의 댓글