<코드예제>
def love_you(your_name = "Kim", my_name):
print(f"{my_name} loves {your_name}")
출력결과: "SyntaxError: non-default argument follows default argument"
위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변인자를 사용한다.
위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것입니다.
위치 인자는 항상 제일 앞에 와야하는 특징을 지닌다. 그렇지 않으면 매개변수가 성립이 되지 않는다. 위치상 우선순위는 다음 흐름과 같다: [Regular positional args -> Default args -> Variable length positional args ->
Non-default args -> Keyword-Only args with default -> Variable length kwargs]
<코드예제 2.1: 위치 에러>
def func(*args, p1, p2):
print("positional-or-keyword:...{}, {}".format(p1, p2))
print("var-positional (*args):..{}".format(args))
func(1, 2, 3, 4, 5, 9)
출력결과: TypeError: func() missing 2 required keyword-only arguments: 'p1' and 'p2'
<코드예제 2.2: 위치 수정>
def func(p1, p2, *args):
print("positional-or-keyword:...{}, {}".format(p1, p2))
print("var-positional (*args):..{}".format(args))
print("var-keyword:............{}".format(kwargs))
func(1, 2, 3, 4, 5, 9)
출력결과: positional-or-keyword:...1, 2
var-positional (*args):..(3, 4, 5, 9)
<코드예제 3.1: 위치에러>
def func(**kwargs, p1, p2, *args):
print("positional-or-keyword:...{}, {}".format(p1, p2))
print("var-positional (*args):..{}".format(args))
print("var-keyword:............{}".format(kwargs))
func(1, 2, 3, 4, 5, 9, key1=7, key2=8)
출력결과: def func(**kwargs, p1, p2, *args):
SyntaxError: invalid syntax
<코드예제 3.2: 위치수정>
def func(p1, p2, *args, **kwargs):
print("positional-or-keyword:...{}, {}".format(p1, p2))
print("var-positional (*args):..{}".format(args))
print("var-keyword:............{}".format(kwargs))
func(1, 2, 3, 4, 5, 9, key1=7, key2=8)
출력결과: positional-or-keyword:...1, 2
var-positional (*args):..(3, 4, 5, 9)
var-keyword:............{'key1': 7, 'key2': 8}
*특이사항으로, 3.2 예제에서 args를 지우면, "TypeError: func() takes 2 positional arguments but 6 were given" 와 같은 에러메세지가 뜨게 되는데, 이는 중간 가변인자가 사라져서 주어진 정수 인자값을 모두 위치인자로 착각했기 때문이다. 위치인자는 2개밖에 설정이 되지 않기 때문에 갯수 초과로 에러메세지가 나게 된다.