下面的代码片段调用parse_args()来识别参数--num,并在解析后测试该值在单独的代码中是否可接受。
import argparse
def cmd_line_opts(cmdline):
parser = argparse.ArgumentParser(description="blah blah",)
parser.add_argument('--num', default=None, type=int,)
return parser.parse_args(cmdline)
p = cmd_line_opts(['--num', '2'])
if p.num < 1:
raise ValueError('--num must be > 0')
p = cmd_line_opts(['--num', '0'])
if p.num < 1:
raise ValueError('--num must be > 0')
我想知道是否有可能将测试和适当的错误消息直接包含在解析中。我怀疑这涉及使用Action API,但我不知道从操作返回时如何发出失败信号。
答案 0 :(得分:1)
您只需要为参数自定义类型。
def positive_int(s):
try:
s = int(s)
if s <= 0:
raise ValueError()
except ValueError:
raise ArgumentTypeError("Not a valid positive integer: {}".format(s))
# ...
parser.add_argument("--num", type=positive_int, default=0)
type
参数是任何可接收字符串并返回用于该参数值的值的可调用对象。不必是实际类型(内置或其他)。
答案 1 :(得分:0)
在上面,对@chepner的回答完全表示感谢。至少在我的系统上,您需要限定ArgumentTypeError。我将其添加到注释中,但认为这对只想复制和粘贴代码的人会有所帮助。
import argparse
def positive_int(s):
try:
s = int(s)
if s <= 0:
raise ValueError()
except ValueError:
raise argparse.ArgumentTypeError("Not a valid positive integer: {}".format(s))
def cmd_line_opts(cmdline):
parser = argparse.ArgumentParser(description="blah blah",)
parser.add_argument("--num", type=positive_int, default=0)
return parser.parse_args(cmdline)
p = cmd_line_opts(['--num', 'x'])