파이썬에는 인자의 종류가 2가지가 있는데 하나는 positional arguments이고 하나는 keyword arguments이다.
그리고 정해지지 않은 인자를 선언하기 위해 variable arguments가 있고 이는 인자 2종류에 모두 적용할 수 있다.(arbitrary arguments 라고도 부른다.)
variable length arguments는 positional arguments의 정해지지 않은 임의의 인자를 담기 위해 만들어졌으며 def func(*args) 형태로 선언할 수 있으며 데이터는 리스트 객체 혹은 튜플 형으로 만들어진다.
variable length keyword arguments는 keyword arguments의 정해지지 않은 임의의 인자를 담기위해 만들어졌으며 def func(**kwargs) 형태로 선언할 수 있으며 데이터는 딕셔너리 형태로 만들어진다.
배열 순서는 positional arguments, variable length arguments, keyword arguments, variable length keyword arguments 순으로 배열한다.(지키지 않을 경우 오류가 발생한다.)
만약, def func(a=0, b): 라고 정의한 후 함수를 호출할 때 a는 기본값인 0을 사용하고 b=2라는 값을 주고 싶어 func(2)라고 함수를 호출한다면 의도와 다르게 a에 2가 배정이 되어 b는 배정할 값이 없어 에러가 나게 된다.(positional aruguments이기 때문이다.) 이런 경우 non-default value arguments가 앞으로 와야 Default value 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("wecode", "01012341234", "seoul", 20)
위 소스는 실행할 경우 에러가 발생된다.
(1) 원인
가변인수는 여러개의 인수를 가질 수 있기 때문에 모든 인자를 빨아들인다. 그로 인해 위치인수는 인자를 가질 수 없게 되면서 오류가 발생된다.
(2) 해결책
가변인수 '*args'와 위치인수'age'의 위치를 변경하고 함수를 호출할 때의 매개변수인 '20'의 위치 역시 아래와 같이 변경해 준다.
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("wecode", 20, "01012341234", "seoul")
(3) 출력결과
name=wecode
args=('01012341234', 'seoul')
age=20
=> None
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("wecode", "20", mobile="01012341234", address="seoul")
위 소스를 실행할 경우 에러가 발생한다.
(1) 원인
가변 키워드 인수는 위의 함수의 매개변수 중 위치인수와 키워드인수 뒤에 와야 한다. 하지만 위의 소스에서는 가변인수 '**kwargs'의 위치가 키워드 인수인 'address=0' 앞에 위치하고 있어서 오류가 발생한다.
또한, 4번 라인의 print 문에서 double quote 오류가 발생하므로 이 부분을 수정해 주어야 한다.
(2) 해결책
가변인수 '**kwargs'의 위치를 키워드 인수인 'address=0' 앞에 위치 시키고 함수 호출 시 인자인 'address="seoul"도 아래 소스와 같이 위치를 변경해 준다.
def func_param_with_kwargs(name, age, address=0, **kwargs):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("wecode", "20", address="seoul", mobile="01012341234")
(3) 출력결과
name=wecode
age=20
kwargs={'mobile': '01012341234'}
address=seoul
=> None
def mixed_params(name="wecode", *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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
위의 코드를 실행시키면 오류가 발생한다.
(1) 원인 및 해결책
ㄱ. 위치인수(positional argument)인 'age'는 매개변수 위치 중 가장 먼저 나와야 한다.
ㄴ. default value arguments인 name="wecode"는 위치 인수 뒤에 와야 하고 가변인수 앞에 와야 정상적으로 "wecode"값을 받을 수 있다.
ㄷ. 가변인수인 *args는 키워드 인수 앞에 와야 한다.
ㄹ. 키워드 인수 address는 가변인수 뒤에 와야하고 가변 키워드 인수 앞에 와야 한다.
ㄹ. 가변 키워드 인수인 **kwargs는 마지막에 와야 한다.
(2) 수정 후 코드
def mixed_params(age, name="wecode", *args, address, **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, "wecode", "01012341234", "male", address="seoul" ,mobile="01012341234")
(3) 출력결과
name=wecode
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
=> None