Python argparse整数条件(>=12)

2024-05-20 14:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用argparse请求参数为>;=12。

我找不到使用argparse来获得此结果的方法,似乎没有办法将规则设置为给定值,而只有全套可接受的值,如choices=['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选项直接获得这个结果。


Tags: 方法代码gtparser参数规则sysargparse
3条回答

你可以尝试在解释中介绍一些东西:

import sys, argparse

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

例如,它的Argparse将用invalid choice引发错误

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

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")

注意:我认为ArgumentTypeErrorArgumentError更适合引发异常。但是,argparse没有将ArgumentTypeError作为公共类进行文档化,因此在您自己的代码中使用它可能不正确。我喜欢的一个选项是使用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")

您可以在不创建自定义类型或单独函数的情况下调用解析器错误。对代码示例的简单更改就足够了:

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

相关问题 更多 >