def registMember(sex='남자', name, age):
print(sex)
print(name)
print(age)
...
registMember('James', 32)
위 코드기준으로 설명하면 default parameter가 앞쪽에 선언시 position으로 구분하는 함수 입장에선 'James'가 sex parameter의 argument인지, 아니면 name의 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'"라는 error 가 발생한다. 이는 args가 여러개의 값을 튜플형식으로 받는데 사용하는 parameter 로 함수 호출부에서 두번째(01012341234) 부터 마지막(20)를 args로 인식, 마지막 age는 찾지 못하는 문제가 발생하는 것이다. 이를 해결하려면 age parameter가 positional argument 처리가 되도록 선언 및 호출을 아래와 같이 변경해야 한다.
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
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")
위 코드 실행시 address parameter에 대한 SyntaxError: invalid syntax가 발생한다.
**kwargs는 키와값으로 구성되는 데이터들을 받는 parameter이다.
kwargs 순서부터 들어오는 키와값 구조의 데이터는 전부 kwargs에 들어가므로 그 뒤에 선언되는 단일 parameter는 사용할 수 없다. 이를 해결하려면 아래처럼 parameter 순서를 변경해야 한다.
그러면 호출과정에서 keyword argument 형식을 취하는 address는 address parameter로 인식이 된다.
def func_param_with_kwargs(name, age, address=0, **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")
위 코드는 다음 문제를 갖고 있다.
- default parameter가 가장 앞선 순서에 정의됨(문제 1번 이슈)
- age가 *args 다음순서의 parameter로 정의됨(문제 2번 이슈)
- address가 **kwargs 다음순서의 parameter로 정의되고 호출시 keyword argument로
처리되어 키값 데이터를 kwargs와 충돌된다(문제 3번 이슈)- 위 문제 해결을 위해 parameter 순서를 아래와 같이 변경
def mixed_params(age, address, name="아이유", *args, **kwargs):
....
mixed_params(20, "seoul", "정우성", "01012341234", "male", mobile="01012341234")