Python Args 및 Kwargs 사용법

PythonBeginner
지금 연습하기

소개

본 랩에서는 Python 의 *args와 **kwargs에 대해 학습합니다. 이 특수 구문들은 처음에는 다소 위협적으로 보일 수 있지만, 이해하기는 간단하며 함수를 더욱 유연하게 만들 수 있는 강력한 방법을 제공합니다. 여러분은 가변적인 수의 인수를 받을 수 있도록 함수를 정의하는 방법을 배우게 될 것이며, 이는 많은 Python 프로그램과 라이브러리에서 흔하고 유용한 기능입니다.

Args 및 Kwargs

이 단계에서는 *args와 **kwargs의 기본 구문을 학습합니다. 이들은 함수 정의에서 사용되어 정의되지 않은 수의 인수를 전달할 수 있도록 합니다. *args는 비키워드 (위치 기반) 인수를 위한 것이고, **kwargs는 키워드 인수를 위한 것입니다.

참고: WebIDE(VS Code 와 유사) 사용에 익숙하지 않다면, 이 랩에서 먼저 학습하십시오.

먼저, 모든 인수의 조합을 수락할 수 있는 함수를 정의하는 방법을 살펴보겠습니다. 왼쪽 파일 탐색기에서 ~/project 디렉토리에 있는 main.py 파일을 찾아 편집기에서 엽니다.

main.py에 다음 코드를 추가합니다.

## 모든 수의 위치 인수와 키워드 인수를 수락하는 함수 정의
def some_function(*args, **kwargs):
    print("This function can accept any arguments.")
    print(f"Received positional arguments: {args}")
    print(f"Received keyword arguments: {kwargs}")
    print("-" * 20)

## 모든 수의 위치 인수로 호출
some_function('arg1', 'arg2', 'arg3')

## 모든 수의 키워드 인수로 호출
some_function(key1='arg1', key2='arg2', key3='arg3')

## 위치 인수와 키워드 인수를 모두 사용하여 호출
some_function('positional_arg', key1='keyword_arg')

## 또는 인수를 전혀 사용하지 않고 호출
some_function()

args와 kwargs는 단지 명명 규칙일 뿐이라는 점에 유의하는 것이 중요합니다. 단일 별표 (*) 와 이중 별표 (**) 가 실제 작업을 수행하는 구문입니다. 그러나 이 명명 규칙을 따르는 것은 Python 커뮤니티에서 좋은 관행으로 간주됩니다.

이제 WebIDE 에서 터미널을 열고 다음 명령을 실행하여 스크립트를 실행합니다.

python3 main.py

함수가 다른 호출을 처리하는 방법을 보여주는 다음 출력을 보게 될 것입니다.

This function can accept any arguments.
Received positional arguments: ('arg1', 'arg2', 'arg3')
Received keyword arguments: {}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {'key1': 'arg1', 'key2': 'arg2', 'key3': 'arg3'}
--------------------
This function can accept any arguments.
Received positional arguments: ('positional_arg',)
Received keyword arguments: {'key1': 'keyword_arg'}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {}
--------------------

이는 *args가 위치 인수를 튜플 (tuple) 로 수집하고 **kwargs가 키워드 인수를 딕셔너리 (dictionary) 로 수집함을 보여줍니다.

*args

이 단계에서는 *args에 구체적으로 초점을 맞춥니다. 이 구문은 함수가 임의의 수의 위치 인수를 받을 수 있도록 허용합니다. 이러한 인수들은 튜플 (tuple) 로 수집됩니다.

main.py의 이전 내용을 지우고 다음 코드를 추가합니다. 이 예제는 *args를 받고 수신된 인수와 그 유형을 출력하는 함수를 정의합니다.

## *args collects positional arguments into a tuple
def some_function(*args):
    print(f'Arguments passed: {args} as {type(args)}')

## Pass multiple arguments - they'll be collected into the args tuple
some_function('arg1', 'arg2', 'arg3')

이 코드에서 함수 시그니처의 *args는 Python 에게 some_function에 전달된 모든 추가 위치 인수를 모아서 args라는 이름의 튜플에 넣으라고 지시합니다.

이제 터미널에서 스크립트를 실행합니다:

python3 main.py

출력은 인수가 튜플로 전달되었음을 확인할 것입니다:

Arguments passed: ('arg1', 'arg2', 'arg3') as <class 'tuple'>

이는 *args가 각 인수를 별도의 매개변수로 정의할 필요 없이 가변적인 수의 입력을 처리하는 간단한 방법을 제공하는 방법을 보여줍니다.

**kwargs

이 단계에서는 **kwargs를 사용하는 방법을 배웁니다. 이 구문은 임의의 수의 키워드 인수 (keyword arguments) 를 딕셔너리 (dictionary) 로 수집하는 데 사용됩니다. 이는 사전에 정의하지 않은 명명된 인수를 처리해야 할 때 유용합니다.

main.py의 내용을 지우고 다음 코드를 추가합니다. 이 예제는 **kwargs를 받고 수집된 키워드 인수와 그 유형을 출력하는 함수를 정의합니다.

## **kwargs collects keyword arguments into a dictionary
def some_function(**kwargs):
    print(f'keywords: {kwargs} as {type(kwargs)}')

## Pass keyword arguments - they'll be collected into the kwargs dict
some_function(key1='arg1', key2='arg2')

여기서 함수 시그니처의 **kwargs는 Python 에게 some_function에 전달된 모든 키워드 인수를 kwargs라는 이름의 딕셔너리로 수집하라고 지시합니다. 딕셔너리의 키는 인수 이름이고 값은 인수 값입니다.

터미널에서 스크립트를 실행합니다:

python3 main.py

출력은 키워드 인수가 딕셔너리로 수집되었음을 보여줄 것입니다:

keywords: {'key1': 'arg1', 'key2': 'arg2'} as <class 'dict'>

이 기능은 옵션이나 구성을 전달해야 하는 함수에 Python 에서 널리 사용되며, 깔끔하고 읽기 쉬운 함수 호출을 가능하게 합니다.

요약

본 랩 (lab) 에서는 Python 에서 *args와 **kwargs를 사용하여 더욱 유연한 함수를 만드는 방법을 배웠습니다.

다음과 같은 내용을 학습했습니다:

  • *args는 가변적인 수의 위치 인수를 튜플 (tuple) 로 수집합니다.
  • **kwargs는 가변적인 수의 키워드 인수를 딕셔너리 (dictionary) 로 수집합니다.
  • args와 kwargs는 관례적인 이름이지만, 이 기능을 활성화하는 것은 *와 ** 구문입니다.

*args와 **kwargs를 숙달하는 것은 더 진보되고 재사용 가능한 Python 코드를 작성하는 데 핵심적인 단계입니다. 이제 다양한 종류의 입력에 더 잘 적응할 수 있는 함수를 만들 수 있습니다.