python argparse限制arg值操作API?

时间:2019-03-22 18:00:50

标签: python python-2.7

下面的代码片段调用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,但我不知道从操作返回时如何发出失败信号。

2 个答案:

答案 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'])