来自Julia的ArgParse允许为每个命令行参数传递一个函数,该函数将检查传递的参数是否可以被接受(参见这里:http://argparsejl.readthedocs.org/en/latest/argparse.html?highlight=range_tester)。例如,这可用于将传递的参数数字参数约束为正数。
可以通过在解析参数后手动检查参数来做到这一点,但我认为range_tester
方法更清晰。在Python的argparse中是否存在等效的功能?我还没有找到它。
答案 0 :(得分:3)
尝试type
的{{1}}参数。它可以采取任何可赎回。请参阅perfect_square
获取灵感的示例。
以下程序创建add_argument
,接受特定范围内的值,而不使用type
(可能适用于大范围?):
choice
输出:
import argparse
parser = argparse.ArgumentParser()
def int_range(start, end):
def range_type(arg):
try:
val = int(arg)
except ValueError:
raise argparse.ArgumentTypeError("Invalid value for range (%d, %d): %r" % (start, end, arg))
if val not in range(start, end):
raise argparse.ArgumentTypeError("%d not in range (%d, %d)" % (val, start, end))
return val
return range_type
parser.add_argument('--foo', type=int_range(10, 100))
args = parser.parse_args()
print("Foo is %d" % args.foo)
请注意,转换失败时会引发> python argparse_type.py --foo 0
usage: argparse_type.py [-h] [--foo FOO]
argparse_type.py: error: argument --foo: 0 not in range (10, 100)
> python argparse_type.py --foo bar
usage: argparse_type.py [-h] [--foo FOO]
argparse_type.py: error: argument --foo: Invalid value for range (10, 100): 'bar'
> python argparse_type.py --foo 50
Foo is 50
。这样,argparse可以显示帮助屏幕和自定义错误消息。如果引发argparse.ArgumentTypeError
,而不是ValueError
内置,则会显示默认消息“invalid int value:...”。