다음과 같이 함수에 인수를 순서대로 넣는 방식을 위치 인수(positional argument)라고 합니다.
print(10, 20, 30) //10 20 30
위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변인자를 사용합니다.
위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것입니다.
def refresh_connection(a, *args, **kwargs): a.close() return make_connection(*args, **kwargs) //None
Regular positional args -> Default args -> Variable length positional args ->
Non-default args -> Keyword-Only args with default -> Variable length kwargs**
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'
(age는 position인데 keyword가 있다는 오류)
즉, position, keyward 중 position이 먼저 와야한다 또한 가변인수(variable length arguments)는 순서상 가장 마지막에 와야한다. 따라서 position인수가 오고 그 다음에 variable length가 와야한다.
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("정우성", "01012341234", "seoul", 20)
-> //name=정우성
args=('seoul', 20)
age=01012341234
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")
-> //Invaild syntax
즉, position인 name과 age가 자리하고 위의 인자 우선순위 처럼 그 뒤로 가변키워드인수(Variable length keyword arguments)가 위치하고 마지막으로 Keyword-Only args with default인 address가 있기 때문이다.
아래 코드처럼 address와 **kwargs의 위치를 바꿔야한다. default값이 있는 address는 position보다 뒤에 와야되기 때문에 name과 age뒤에 위치한다.
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("정우성", "20", mobile="01012341234", address="seoul")
-> //name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
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")
-> //Invaild syntax
즉, 아래 코드처럼 posiion인 age를 가장 앞으로 옮겨주고 address와 kwargs의 위치를 바꿔주면 오류는 사라진다.
def mixed_params(age, name="아이유", *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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
-> //name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
default값을 사용할건지, 안할건지에 따라 name="아이유"의 값을 변경할 수 있는데
args와 name="아이유"의 값의 위치를 변경하게 되면 args의 출력에는 args=('정우성', '01012341234', 'male')이 출력되고 name에는 default 값인 아이유가 출력되는 것을 확인할 수 있다.
def mixed_params(age, *args, name="아이유", 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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
-> //name=아이유
args=('정우성', '01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul