Python에서 가변 길이 인수(*args, **kwargs)를 사용하는 방법

사업

다음 함수 인수는 아마도 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