บทนำ
สมมติว่าเราต้องเขียนโปรแกรมรับจำนวนแชมป์แกรนด์สแลมเทนนิสจากผู้ใช้ จำนวนสูงสุดคือ 20 (เฟเดอเรอร์และナダล) ส่วนต่ำสุดคือ 0 เราต้องการจำกัดให้ผู้ใช้ป้อนได้เฉพาะช่วง 0-20 เท่านั้น
ตัวอย่างโดยไม่มี choices
import argparse
def get_args():
parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('titles', metavar='titles', type=int, help='GrandSlam Titles')
return parser.parse_args()
def main(titles):
print(f" *** Player had won {titles} GrandSlam titles.")
if __name__ == '__main__':
args = get_args()
main(args.titles)
โปรแกรมจะยอมรับค่าใดก็ได้ รวมถึงค่าลบหรือเกิน 20
ใช้ choices จำกัดช่วงค่า
import argparse
def get_args():
parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('titles', metavar='titles', type=int,
choices=range(0, 20), help='GrandSlam Titles')
return parser.parse_args()
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, ... 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, ... 19)
สรุป
choicesรับลิสต์ของค่าที่อนุญาต argparse จะหยุดโปรแกรมถ้าค่าไม่อยู่ในลิสต์- สามารถใช้กับสตริงได้เช่นกัน เช่น
choices=['federer', 'nadal', 'djokovic']