在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回答