다음 함수 인수는 아마도 Python 코드를 보고 “이게 뭐야?
*args
**kwargs
다음과 같이 함수 정의의 인수에 별표를 추가하여 임의의 수의 인수(가변 길이 인수)를 지정할 수 있습니다.
*
**
*args,**kwargs라는 이름은 종종 규칙으로 사용됩니다. 그러나 * 및 **가 시작 부분에 있는 한 다른 이름도 사용할 수 있습니다. 다음 샘플 코드는 *args,**kwargs라는 이름을 사용합니다.
다음 세부 사항은 아래에 설명되어 있습니다.
*args
:여러 인수를 튜플로 허용**kwargs
:여러 키워드 인수를 사전으로 허용
*args:여러 인수를 튜플로 허용
*args와 같이 *로 인수를 정의하여 임의의 인수 수를 지정할 수 있습니다.
def my_sum(*args):
return sum(args)
print(my_sum(1, 2, 3, 4))
# 10
print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36
여러 인수가 함수에서 튜플로 수신됩니다. 예제에서 sum() 함수는 합계를 계산하기 위해 튜플을 전달합니다.
def my_sum2(*args):
print('args: ', args)
print('type: ', type(args))
print('sum : ', sum(args))
my_sum2(1, 2, 3, 4)
# args: (1, 2, 3, 4)
# type: <class 'tuple'>
# sum : 10
위치 인수와 결합할 수도 있습니다.
위치 인수 뒤(오른쪽)에 지정된 값은 튜플로 args에 전달됩니다. 위치 인수만 있는 경우 빈 튜플입니다.
def func_args(arg1, arg2, *args):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
func_args(0, 1, 2, 3, 4)
# arg1: 0
# arg2: 1
# args: (2, 3, 4)
func_args(0, 1)
# arg1: 0
# arg2: 1
# args: ()
*로 표시된 인수가 먼저 정의될 수 있습니다. 단, 이 경우 *args 이후에 정의된 인수는 반드시 키워드 형태로 지정해야 한다. 덧붙여서 키워드 형식은 “인수 이름 = 값” 형식입니다.
마지막 값은 위치 인수에 자동으로 전달되지 않습니다. 따라서 키워드 인수로 지정하지 않으면 TypeError 오류가 발생합니다.
def func_args2(arg1, *args, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'
func_args2(0, 1, 2, 3, arg2=4)
# arg1: 0
# arg2: 4
# args: (1, 2, 3)
* 인수만 지정된 경우 후속 인수는 항상 키워드 인수로 지정해야 합니다.(keyword-only argument
)
def func_args_kw_only(arg1, *, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given
func_args_kw_only(100, arg2=200)
# arg1: 100
# arg2: 200
**kwargs:여러 키워드 인수를 사전으로 허용
**kwargs와 같이 ,**로 인자를 정의하여 키워드 인자의 임의 개수를 지정할 수 있습니다.
함수에서 인수의 이름은 키가 키이고 값이 값인 사전으로 수신됩니다.
def func_kwargs(**kwargs):
print('kwargs: ', kwargs)
print('type: ', type(kwargs))
func_kwargs(key1=1, key2=2, key3=3)
# kwargs: {'key1': 1, 'key2': 2, 'key3': 3}
# type: <class 'dict'>
위치 인수와 함께 사용할 수도 있습니다.
def func_kwargs_positional(arg1, arg2, **kwargs):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('kwargs: ', kwargs)
func_kwargs_positional(0, 1, key1=1)
# arg1: 0
# arg2: 1
# kwargs: {'key1': 1}
함수 호출 시 **를 인자로 딕셔너리 객체를 지정하면 확장하여 각각의 인자로 전달할 수 있습니다.
d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}
func_kwargs_positional(**d)
# arg1: 100
# arg2: 200
# kwargs: {'key1': 1, 'key2': 2}
**로 표시된 인수는 인수 끝에만 정의할 수 있습니다. **로 표시된 인수 뒤에 다른 인수를 정의하면 SyntaxError 오류가 발생합니다.
# def func_kwargs_error(**kwargs, arg):
# print(kwargs)
# SyntaxError: invalid syntax