在Python中,使用argparse,只允许正整数
标题几乎总结了我想要发生的事情。
这是我所拥有的,虽然程序不会在非正整数上爆炸,但我希望用户被告知非正整数基本上是无意义的。
import argparse parser = argparse.ArgumentParser() parser.add_argument("-g", "--games", type=int, default=162, help="The number of games to simulate") args = parser.parse_args()
而输出:
python simulate_many.py -g 20 Setting up... Playing games... ....................
以负值输出:
python simulate_many.py -g -2 Setting up... Playing games...
现在,显然我可以添加一个if来确定if args.games
是否为负值,但是我很好奇是否有办法在argparse
级别将其陷入困境,以利用自动使用打印。
理想情况下,它会打印类似这样的内容:
python simulate_many.py -ga usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE] simulate_many.py: error: argument -g/--games: invalid int value: 'a'
像这样:
python simulate_many.py -g -2 usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE] simulate_many.py: error: argument -g/--games: invalid positive int value: '-2'
现在我正在这样做,我想我很高兴:
if args.games <= 0: parser.print_help() print "-g/--games: must be positive." sys.exit(1)
这应该是可能的利用type
。 您仍然需要定义一个实际的方法来为您做出决定:
def check_positive(value): ivalue = int(value) if ivalue <= 0: raise argparse.ArgumentTypeError("%s is an invalid positive int value" % value) return ivalue parser = argparse.ArgumentParser(...) parser.add_argument('foo', type=check_positive)
这基本上只是argparse
文档中来自perfect_square
函数的一个改编的例子。
type
将是推荐的选项来处理条件/检查,如在余士的答案。
在你的具体情况下,你也可以使用choices
参数,如果你的上限也是已知的:
parser.add_argument('foo', type=int, choices=xrange(5, 10))
快速和肮脏的方式,如果你有一个可预测的最大和最小值为您的精益,是一个范围的使用choices
parser.add_argument('foo', type=int, choices=xrange(0, 1000))
一个更简单的select,特别是如果parse_args
argparse.ArgumentParser
,则是从parse_args
方法内启动validation。
在这样一个子类里面:
def parse_args(self, args=None, namespace=None): """Parse and validate args.""" namespace = super().parse_args(args, namespace) # super() works in Python 3 if namespace.games <= 0: raise self.error('The number of games must be a positive integer.') return namespace
这种技术可能不像自定义的可调用的那样酷,但是它可以完成这项工作。
关于ArgumentParser.error(message)
:
此方法将包含消息的使用消息打印到标准错误,并终止状态码为2的程序。
信用: 由jonatan回答