HOWTO · Python

Python의 다른 함수에 Kwargs 전달

Python의 키워드 인수 사용법, **kwargs로 키워드 인수를 사전에 모으는 방법, 그리고 그 사전을 다른 함수에 전달하는 방법을 알아봅니다.

이 페이지의 내용

키워드 인수 사전을 다른 Python 함수에 전달하려면 display(**details)처럼 호출할 때 **mapping을 사용합니다. Python은 각 키와 값을 풀어 이름이 지정된 인수로 전달합니다. 함수는 **kwargs 매개변수로 여러 키워드 인수를 모은 뒤 같은 방식으로 다른 함수에 전달할 수 있습니다.

Python의 키워드 인수

키워드 인수는 함수 호출에서 값을 매개변수 이름에 연결합니다. 각 인수를 name=value 형식으로 작성합니다. 예를 들어 greet(first="Anne", age=27)은 이름을 지정해 값을 전달합니다. 함수에는 해당 이름을 받는 매개변수가 정의되어 있어야 하며, 값은 호출에서의 위치와 관계없이 이름이 일치하는 매개변수에 할당됩니다.

함수에 매개변수가 여러 개 있을 때 키워드 인수를 사용하면 호출 내용을 더 쉽게 읽을 수 있습니다. 기본값이 있는 매개변수는 그대로 두고 필요한 선택적 매개변수만 지정할 수도 있습니다. 함수가 **kwargs로 추가 키워드 인수를 받지 않는 한, 호출에 사용한 이름은 함수의 매개변수 이름과 일치해야 합니다.

Python에서 **kwargs로 함수 호출하기

함수 정의에서 매개변수 이름 앞에 **를 붙이면 별도의 이름 있는 매개변수로 정의되지 않은 키워드 인수를 모을 수 있습니다. 관례상 이 매개변수에는 kwargs라는 이름을 쓰지만, 유효한 변수 이름이라면 무엇이든 사용할 수 있습니다. 함수 내부에서 Python은 모은 값을 사전으로 제공합니다.

예를 들어 def describe(**kwargs): ...는 describe(name="Rabbit", sound="squeak")와 같은 호출을 받을 수 있습니다. 이때 만들어지는 사전에는 두 항목이 있으며, name은 "Rabbit"에, sound는 "squeak"에 대응합니다. 이렇게 하면 함수 시그니처에 옵션을 하나씩 나열하지 않고도 이름이 지정된 옵션을 받을 수 있습니다. 함수는 사전의 값을 확인하거나 필요한 값을 선택하거나 다른 함수에 전달할 수 있습니다.

*args는 위치 인수를 위한 비슷한 기능으로, 추가 위치 값을 튜플에 모읍니다. 위치 값에는 *args를, 키워드 값에는 **kwargs를 사용합니다. 위치 인수를 모으는 표기는 **args가 아닙니다.

Python에서 **kwargs를 다른 함수에 전달하기

호출할 때 사전 이름 앞에 **를 붙이면 함수가 그 사전을 다른 함수로 전달할 수 있습니다. 예제에서는 info가 details의 항목을 모은 다음 show_details를 호출하면서 이를 풀어 전달합니다. 호출된 함수는 자체 **kwargs 매개변수를 통해 사전의 각 항목을 이름 있는 인수로 받습니다.

def show_details(**kwargs):
    for key, value in kwargs.items():
        print(key, value)


def info(**kwargs):
    show_details(**kwargs)


details = {"name": "Shen", "age": 27, "degree": "SE"}
info(**details)
name Shen
age 27
degree SE

info(**details) 호출은 매핑을 풀어 info에 키워드 인수로 전달합니다. info는 이 인수들을 로컬 kwargs 사전에 모으고, show_details(**kwargs)는 같은 항목을 풀어 다음 함수 호출에 전달합니다. 반복문은 각 키와 값을 출력합니다. 출력 블록에는 name의 값 Shen, age의 값 27, degree의 값 SE가 표시됩니다. 블록의 레이블은 코드와의 바이트 일치를 위해 영어 그대로입니다. 사전의 키가 받는 함수에서 허용하는 이름과 일치하도록 하세요. 명시적 매개변수를 선언한 함수라면 각 키가 그중 하나와 일치하거나 함수의 **kwargs 매개변수로 받아들여져야 합니다.

전달하는 함수가 모든 키를 미리 알 필요는 없습니다. 이 패턴은 호출자가 제공한 옵션을 넘기면서 다른 호출을 감싸는 동작을 추가하는 래퍼에 유용합니다. 래퍼에 명시적 매개변수도 있다면 시그니처에서 **kwargs보다 앞에 정의하고, 필요한 키워드 인수만 다음 함수로 전달하면 됩니다.

결론

일반 키워드 인수를 전달할 때는 name=value를 사용하고, 함수 정의에서 **kwargs를 쓰면 추가 키워드 인수를 사전에 모을 수 있습니다. 함수 호출에서 **mapping을 사용하면 사전의 항목을 풀어 다른 함수에 전달합니다. 위치 인수에는 *args를 사용합니다. 안정적으로 인수를 전달하려면 매핑의 키가 받는 함수에서 허용하는 매개변수 이름과 일치해야 합니다.