我需要使用来要求参数> = 12 argparse。
argparse
我无法找到一种使用来获得此结果的方法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选项直接获得此结果。
一种方法是使用自定义类型。
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")
注意:与相比,我认为ArgumentTypeError是一个更正确的例外ArgumentError。但是,ArgumentTypeError并未将其记录为公共类argparse,因此在您自己的代码中使用它可能并不正确。我喜欢的一个选项是argparse.error像alecxe一样在他的答案中使用,尽管我将使用自定义操作而不是类型函数来访问解析器对象。
ArgumentTypeError
ArgumentError
argparse.error
更为灵活的选项是自定义操作,它提供对当前解析器和名称空间对象的访问。
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")