Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python argparse의 choices 옵션으로 인수 값 제한하는 방법

소개

사용자로부터 테니스 그랜드슬램 우승 횟수를 입력받아 처리하는 프로그램을 작성해야 한다고 가정해 보겠습니다. 2020년 기준으로 페더러와 나달이 테니스 역사상 최다 그랜드슬램 타이틀인 20개를 공유하고 있으며, 최솟값은 0입니다. 아직 첫 그랜드슬램 타이틀을 노리며 도전 중인 선수들도 많습니다.

이 타이틀 수를 입력받는 프로그램을 만들어 보겠습니다.

참고 - 프로그램은 터미널에서 실행해야 합니다.

기본 예제

import argparse

def get_args():
""" Function : get_args
.add_argument에 사용되는 매개변수
1. metavar - 사용자에게 데이터 타입에 대한 힌트를 제공합니다.
   - 기본적으로 모든 인수는 문자열로 처리됩니다.

2. type - 실제 Python 데이터 타입
   - (str 주위에 따옴표가 없음에 유의하세요)

3. help - 해당 매개변수에 대한 간단한 사용법 설명

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# int 타입의 첫 번째 인수(선수의 타이틀 수) 추가
parser.add_argument('titles',
metavar='titles',
type=int,
help='GrandSlam Titles')

return parser.parse_args()

# main 함수 정의
def main(titles):
print(f" *** Player had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.titles)

출력 결과

이제 프로그램이 타이틀 수를 입력받을 준비가 되었습니다. 임의의 숫자(정수)를 인수로 전달해 보겠습니다.

<<< python test.py 20
*** Player had won 20 GrandSlam titles.
<<< python test.py 50
*** Player had won 50 GrandSlam titles.
<<< python test.py -1
*** Player had won -1 GrandSlam titles.
<<< python test.py 30
*** Player had won 30 GrandSlam titles.

코드 자체에는 기술적인 문제가 없지만, 분명한 기능적 문제가 있습니다. 프로그램이 음수를 포함한 어떤 숫자든 그랜드슬램 타이틀 수로 받아들이기 때문입니다.

이처럼 입력 가능한 그랜드슬램 타이틀 값의 선택지를 제한하고 싶은 경우에는 choices 옵션을 사용하면 됩니다.

choices 옵션으로 값 범위 제한하기

다음 예제에서는 타이틀 값을 (0, 20) 범위로 제한합니다.

import argparse
def get_args():
""" Function : get_args
.add_argument에 사용되는 매개변수
1. metavar - 사용자에게 데이터 타입에 대한 힌트를 제공합니다.
   - 기본적으로 모든 인수는 문자열로 처리됩니다.

2. type - 실제 Python 데이터 타입
   - (str 주위에 따옴표가 없음에 유의하세요)

3. help - 해당 매개변수에 대한 간단한 사용법 설명

4. choices - 사용자가 이 프로그램에 입력할 수 있는 사전 정의된 선택지 범위

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# int 타입의 첫 번째 인수(선수의 타이틀 수) 추가
parser.add_argument('titles',
metavar='titles',
type=int,
choices=range(0, 20),
help='GrandSlam Titles')

return parser.parse_args()

# main 함수 정의
def main(titles):
print(f" *** Player had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.titles)

출력 결과

>>> python test.py 30
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: 30 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py 10
*** Player had won 10 GrandSlam titles.
<<< python test.py -1
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: -1 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py 0
*** Player had won 0 GrandSlam titles.
<<< python test.py 20
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: 20 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

정리

  • choices 옵션은 값의 목록을 받습니다. 사용자가 이 목록에 없는 값을 입력하면 argparse가 프로그램 실행을 중단시킵니다.

  • 사용자는 반드시 0~19 사이의 숫자 중 하나를 선택해야 하며, 그렇지 않으면 argparse가 오류와 함께 종료됩니다.

마지막으로, 문자열 선택지를 받는 프로그램도 만들 수 있습니다.

문자열 choices 활용 예제

import argparse

def get_args():
""" Function : get_args
.add_argument에 사용되는 매개변수
1. metavar - 사용자에게 데이터 타입에 대한 힌트를 제공합니다.
   - 기본적으로 모든 인수는 문자열로 처리됩니다.

2. type - 실제 Python 데이터 타입
   - (str 주위에 따옴표가 없음에 유의하세요)

3. help - 해당 매개변수에 대한 간단한 사용법 설명

4. choices - 사용자가 이 프로그램에 입력할 수 있는 사전 정의된 선택지 범위

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# str 타입의 첫 번째 인수(선수 이름) 추가
parser.add_argument('player',
metavar='player',
type=str,
choices=['federer', 'nadal', 'djokovic'],
help='Tennis Players')

# int 타입의 두 번째 인수(선수의 타이틀 수) 추가
parser.add_argument('titles',
metavar='titles',
type=int,
choices=range(0, 20),
help='GrandSlam Titles')

return parser.parse_args()

# main 함수 정의
def main(player,titles):
print(f" *** {player} had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.player,args.titles)

출력 결과

<<< python test.py
usage: test.py [-h] player titles
test.py: error: the following arguments are required: player, titles
<<< python test.py "federer" 30
usage: test.py [-h] player titles
test.py: error: argument titles: invalid choice: 30 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py "murray" 5
usage: test.py [-h] player titles
test.py: error: argument player: invalid choice: 'murray' (choose from 'federer', 'nadal', 'djokovic')
<<< python test.py "djokovic" 17
*** djokovic had won 17 GrandSlam titles.