[파이썬] argparse 인수의 특별한 데이터 타입 처리

소개

argparse는 Python의 표준 라이브러리로, 명령행 인수를 처리하기 위한 강력한 도구입니다. 이 라이브러리를 사용하면 프로그램을 실행할 때 사용자에게 인수를 전달하고, 이를 쉽게 처리할 수 있습니다.

argparse는 기본적으로 문자열 타입의 인수를 처리하지만, 때로는 특별한 데이터 타입을 처리해야 할 때가 있습니다. 이러한 상황에서는 argparse의 커스텀 데이터 타입 기능을 사용하여 좀 더 유연하게 인수를 처리할 수 있습니다.

커스텀 데이터 타입 정의하기

argparse에서 커스텀 데이터 타입을 정의하는 것은 매우 간단합니다. argparse.Action 클래스를 상속받아서 커스텀 액션을 작성하고, 해당 액션을 argparse.ArgumentParseradd_argument() 메서드에 등록하면 됩니다.

아래는 간단한 예제로, 특정 범위 내의 숫자만 입력할 수 있는 데이터 타입을 처리하는 커스텀 액션을 정의하는 코드입니다.

import argparse

class RangeAction(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        self.min_value = kwargs.pop('min_value', None)
        self.max_value = kwargs.pop('max_value', None)
        super().__init__(option_strings, dest, **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        if self.min_value is not None and values < self.min_value:
            parser.error(f"{self.dest} must be greater than or equal to {self.min_value}")
        if self.max_value is not None and values > self.max_value:
            parser.error(f"{self.dest} must be less than or equal to {self.max_value}")
        setattr(namespace, self.dest, values)

# 커스텀 액션을 사용하는 인수 추가
parser = argparse.ArgumentParser()
parser.add_argument('--number', action=RangeAction, type=int, min_value=1, max_value=10, help='Enter a number between 1 and 10')

위의 코드에서 RangeAction 클래스는 argparse.Action 클래스를 상속받습니다. __init__() 메서드에서는 최소값과 최대값을 가져와서 인스턴스 변수로 저장합니다. __call__() 메서드는 입력된 값이 범위에 속하는지 확인하고, 범위를 벗어날 경우 에러를 발생시킵니다.

커스텀 데이터 타입 사용하기

커스텀 데이터 타입을 사용하는 방법은 매우 간단합니다. argparse에서 인수의 타입을 지정할 때, 커스텀 액션을 사용하고자 하는 인수에 action=RangeAction과 같이 지정해주면 됩니다.

args = parser.parse_args()
print(f"The number is {args.number}")

위의 코드에서 args.number는 사용자가 입력한 숫자를 가져옵니다. 이때, 입력한 숫자는 RangeAction 클래스에서 정의한 범위 내의 값이어야 합니다. 그렇지 않을 경우, argparse가 자동으로 에러 메시지를 출력하고 프로그램을 종료합니다.

마무리

argparse는 인수 처리를 위한 강력한 도구지만, 때로는 기본적인 데이터 타입 이외의 인수를 처리해야 할 때도 있습니다. 이런 경우에는 argparse의 커스텀 데이터 타입 기능을 사용하여 보다 유연하게 인수를 처리할 수 있습니다. 위의 예제를 참고하여, 프로그램의 요구에 맞는 커스텀 데이터 타입을 정의하고 사용해보세요.