본문 바로가기

argparse 모듈의 add_argument 메서드는 다양한 옵션을 제공합니다. 이 중에서 metavar, type, nargs에 대해 설명하겠습니다.

metavar

metavar는 argparse가 생성하는 도움말 메시지에서 인자의 이름을 지정하는 데 사용됩니다. 예를 들어, 인자의 실제 이름 대신 사용자에게 더 이해하기 쉬운 이름을 표시할 수 있습니다.

예제

import argparse

parser = argparse.ArgumentParser(description="Example with metavar")
parser.add_argument('-f', '--file', metavar='FILE', help='Input file')
args = parser.parse_args()

위의 예제에서 -f 또는 --file 인자는 도움말 메시지에 FILE로 표시됩니다.

$ python script.py -h
usage: script.py [-h] [-f FILE]

Example with metavar

optional arguments:
  -h, --help  show this help message and exit
  -f FILE, --file FILE  Input file

type

type는 인자가 어떤 데이터 타입으로 변환되어야 하는지를 지정합니다. 기본적으로 모든 인자는 문자열로 처리되지만, type을 지정하면 해당 타입으로 변환됩니다.

예제

import argparse

parser = argparse.ArgumentParser(description="Example with type")
parser.add_argument('integer', type=int, help='An integer value')
args = parser.parse_args()
print(args.integer)

위의 예제에서 integer 인자는 정수로 변환됩니다.

$ python script.py 10
10

$ python script.py ten
usage: script.py [-h] integer
script.py: error: argument integer: invalid int value: 'ten'

nargs

nargs는 인자가 몇 개의 값을 가질 수 있는지를 지정합니다. 다양한 옵션이 있습니다.

주요 옵션

  • N: 정확히 N개의 값을 기대합니다.
  • ?: 0개 또는 1개의 값을 기대합니다.
  • *: 0개 이상의 값을 기대합니다.
  • +: 1개 이상의 값을 기대합니다.

예제

import argparse

parser = argparse.ArgumentParser(description="Example with nargs")
parser.add_argument('--list', nargs='+', help='A list of values')
args = parser.parse_args()
print(args.list)

위의 예제에서 --list 인자는 하나 이상의 값을 가집니다.

$ python script.py --list 1 2 3
['1', '2', '3']

$ python script.py --list
usage: script.py [-h] [--list LIST [LIST ...]]
script.py: error: argument --list: expected at least one argument

종합 예제

위에서 설명한 metavar, type, nargs를 모두 사용한 종합적인 예제를 보겠습니다.

import argparse

parser = argparse.ArgumentParser(description="Example with metavar, type, and nargs")
parser.add_argument('-n', '--number', type=int, metavar='NUM', help='An integer number')
parser.add_argument('--list', nargs='+', type=str, metavar='VAL', help='A list of values')
args = parser.parse_args()
print(f"Number: {args.number}")
print(f"List: {args.list}")

이 예제에서는 -n 인자를 정수로 변환하며, 도움말 메시지에 NUM으로 표시됩니다. --list 인자는 문자열 리스트로 변환되며, 도움말 메시지에 VAL로 표시됩니다.

$ python script.py -n 5 --list a b c
Number: 5
List: ['a', 'b', 'c']

값의 개수가 0이어야 하는 경우

nargs='0'argparse에서 지원되지 않습니다. 대신, action='store_true' 또는 action='store_false'를 사용하여 옵션이 존재하는지 여부를 확인할 수 있습니다. 옵션이 존재하면 True, 존재하지 않으면 False가 됩니다.

그러나 nargs='0'와 같은 동작을 강제하고 싶다면, 기본적인 argparse의 동작 외에 추가적인 검사를 추가해야 합니다.

방법 1: action='store_true' 또는 action='store_false' 사용

이 방법은 값을 가지지 않고, 단순히 옵션이 있는지 없는지 확인할 때 사용됩니다.

import argparse

parser = argparse.ArgumentParser(description="Example with store_true")

# 값이 없어야 하는 옵션
parser.add_argument('--flag', action='store_true', help='A flag that should not have a value')

args = parser.parse_args()

if args.flag:
    print("Flag is set")
else:
    print("Flag is not set")
$ python script.py --flag
Flag is set

$ python script.py
Flag is not set

$ python script.py --flag value
usage: script.py [-h] [--flag]
script.py: error: unrecognized arguments: value

방법 2: 추가적인 검사 추가

argparse로 기본적인 파싱을 수행한 후, 추가적인 검사를 통해 값이 없는지 확인하고, 값이 있으면 에러를 발생시키는 방법입니다.

import argparse
import sys

class MyArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write(f"Error: {message}\n")
        self.print_help()
        sys.exit(2)

parser = MyArgumentParser(description="Example with additional checks")

# 값이 없어야 하는 옵션
parser.add_argument('--flag', action='store_true', help='A flag that should not have a value')

# 나머지 인자 처리
parser.add_argument('args', nargs=argparse.REMAINDER)

args = parser.parse_args()

# 추가 검사: --flag 다음에 값이 오면 에러를 발생시킵니다.
if args.flag and args.args:
    parser.error("--flag option should not have a value")

print("Flag is set" if args.flag else "Flag is not set")
$ python script.py --flag
Flag is set

$ python script.py
Flag is not set

$ python script.py --flag value
usage: script.py [-h] [--flag]
Example with additional checks

optional arguments:
  -h, --help  show this help message and exit
  --flag      A flag that should not have a value
Error: --flag option should not have a value

요약

  • metavar: 도움말 메시지에 표시될 인자의 이름을 지정합니다.
  • type: 인자의 타입을 지정하여, 해당 타입으로 변환합니다.
  • nargs: 인자가 가질 수 있는 값의 개수를 지정합니다.
  • 값이 없어야 하는 옵션은 action='store_true' 또는 action='store_false'를 사용하여 처리할 수 있습니다.
  • argparse의 기본 동작 외에 추가 검사를 통해 값이 없는지 확인하고, 값이 있으면 에러를 발생시킬 수 있습니다.

이 두 가지 방법을 사용하여 값이 없어야 하는 옵션을 처리할 수 있습니다.
이 옵션들을 사용하여 더 유연하고 명확한 명령줄 인터페이스를 만들 수 있습니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.