29

我需要使用argparse.

我找不到使用 获得此结果的方法argparse,似乎无法将规则设置为给定值,而只能设置完整的可接受值集,例如选择 = ['rock'、'paper'、'scissors']。

我的代码是:

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12")
args = parser.parse_args()
if args.bandwidth and args.bandwidth < 12:
    print "ERROR: minimum bandwidth is 12"
    sys.exit(1)

我想知道是否有办法通过某些argparse选项直接获得此结果。

4

4 回答 4

47

一种方法是使用自定义类型。

def bandwidth_type(x):
    x = int(x)
    if x < 12:
        raise argparse.ArgumentTypeError("Minimum bandwidth is 12")
    return x

parser.add_argument("-b", "--bandwidth", type=bandwidth_type, help="target bandwidth >= 12")

注意:我认为ArgumentTypeErrorraise 比ArgumentError. 但是,ArgumentTypeError它没有被 记录为公共类argparse,因此在您自己的代码中使用它可能被认为是不正确的。我喜欢的一个选项是argparse.error像 alecxe 在他的回答中所做的那样使用,尽管我会使用自定义操作而不是类型函数来访问解析器对象。

一个更灵活的选项是自定义操作,它提供对当前解析器和命名空间对象的访问。

class BandwidthAction(argparse.Action):

    def __call__(self, parser, namespace, values, option_string=None):
        if values < 12:
            parser.error("Minimum bandwidth for {0} is 12".format(option_string))
            #raise argparse.ArgumentError("Minimum bandwidth is 12")

        setattr(namespace, self.dest, values)

parser.add_argument("-b", "--bandwidth", action=BandwidthAction, type=int,
                     help="target bandwidth >= 12")
于 2013-09-09T14:40:32.810 回答
23

您可以尝试在解释中介绍的内容:

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, choices=range(12,100))
args = parser.parse_args()

例如,因此,它的 Argparse 将引发错误本身invalid choice

于 2013-09-09T14:49:43.507 回答
21

您可以调用解析器错误,而无需创建自定义类型或单独的函数。对您的代码示例进行简单的更改就足够了:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12")
args = parser.parse_args()
if args.bandwidth and args.bandwidth < 12:
    parser.error("Minimum bandwidth is 12")

这将导致应用程序退出并显示解析器错误:

$ python test.py --bandwidth 11 
usage: test.py [-h] [-b BANDWIDTH]
test.py: error: Minimum bandwidth is 12
于 2016-01-29T11:45:25.553 回答
0

这个怎么样?

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument(
    "-b", "--bandwidth", 
    type=lambda x: (int(x) > 11) and int(x) or sys.exit("Minimum bandwidth is 12"),
    help="target bandwidth >=12"
)

但请注意,我没有在真正的代码中尝试过。或者您可以更改sys.exitparser.error@jonatan 所写的内容。

于 2019-03-14T14:28:55.313 回答