嘗試使用type
參數add_argument
。它可以採取任何可調用的。請參閱perfect_square
的示例以獲取靈感。
下面的程序創建一個type
接受在特定範圍內的值,而無需使用choice
(用於大範圍也許良好):
import argparse
parser = argparse.ArgumentParser()
def int_range(start, end):
def range_type(arg):
try:
val = int(arg)
except ValueError:
raise argparse.ArgumentTypeError("Invalid value for range (%d, %d): %r" % (start, end, arg))
if val not in range(start, end):
raise argparse.ArgumentTypeError("%d not in range (%d, %d)" % (val, start, end))
return val
return range_type
parser.add_argument('--foo', type=int_range(10, 100))
args = parser.parse_args()
print("Foo is %d" % args.foo)
輸出:
> python argparse_type.py --foo 0
usage: argparse_type.py [-h] [--foo FOO]
argparse_type.py: error: argument --foo: 0 not in range (10, 100)
> python argparse_type.py --foo bar
usage: argparse_type.py [-h] [--foo FOO]
argparse_type.py: error: argument --foo: Invalid value for range (10, 100): 'bar'
> python argparse_type.py --foo 50
Foo is 50
注意,一個轉換失敗時引發argparse.ArgumentTypeError
。這樣,argparse可以顯示幫助屏幕和自定義錯誤消息。如果改爲ValueError
而不是int
內建,則會顯示一條默認消息,而不是「invalid int value:...」。
更新,刪除了黑客。 –