标题几乎概括了我希望发生的事情。
下面是我的结果,虽然程序不会因为非正整数而崩溃,但我希望用户知道,非正整数基本上是没有意义的。
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 -g a
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)
6条答案
按热度按时间z31licg01#
利用
type
应该可以做到这一点。您仍然需要定义一个实际的方法来决定这一点:这基本上只是
argparse
文档中perfect_square
函数的一个改编示例。lrpiutwd2#
type
是处理条件/检查的推荐选项,如Yuushi的回答所示。在您的特定情况下,如果上限也是已知的,也可以使用
choices
参数:**注意:**对于python 3.x,请使用
range
而不是xrange
aij0ehis3#
如果您的arg有一个可预测的max和min,那么最快捷的方法就是使用带有range的
choices
csbfibhn4#
一个更简单的替代方法是从
parse_args
方法内部启动验证,尤其是在对argparse.ArgumentParser
进行子类化时。在这样的子类内:
这种技术可能没有自定义可调用对象那么酷,但它确实起作用了。
关于
ArgumentParser.error(message)
:这个方法会打印包含标准错误消息的使用方式消息,并以状态码2结束程式。
贷方:answer by jonatan
icnyk63a5#
如果有人(像我一样)在Google搜索中遇到这个问题,这里有一个例子,说明如何使用模块化方法巧妙地解决更普遍的问题,即只允许在指定范围内使用argparse整数。
这允许您执行以下操作:
变量
foo
现在只允许正整数,就像OP要求的那样。请注意,除了上述形式之外,
IntRange
也可以仅为最大值:pxq42qpu6#
根据Yuushi的答案,您还可以定义一个简单的helper函数,它可以检查一个数字对于各种数值类型是否为正数:
helper函数可用于注解任何数值参数类型,如下所示: