Python 的 argparse 中的 Julia 的 ArgParse range_teser 是否等效?
Equivalent of Julia's ArgParse range_teser in Python's argparse?
Julia 的 ArgParse 允许为每个命令行参数传递一个函数,该函数将检查传递的参数是否可接受(参见此处:http://argparsejl.readthedocs.org/en/latest/argparse.html?highlight=range_tester)。这很有用,例如,将传递的参数数字参数限制为正数。
可以通过在解析参数后手动检查参数来做到这一点,但我认为 range_tester
方法更简洁。 Python 的 argparse 中是否有等效的功能?我还没找到。
试试 add_argument
的 type
参数。它可以接受任何可调用的。请参阅 perfect_square
的示例以获取灵感。
以下程序创建了一个 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.ArgumentTypeError
。这样,argparse 可以显示帮助屏幕和自定义错误消息。如果改为引发 ValueError
,如 int
内置,则会显示默认消息 "invalid int value: ...".
Julia 的 ArgParse 允许为每个命令行参数传递一个函数,该函数将检查传递的参数是否可接受(参见此处:http://argparsejl.readthedocs.org/en/latest/argparse.html?highlight=range_tester)。这很有用,例如,将传递的参数数字参数限制为正数。
可以通过在解析参数后手动检查参数来做到这一点,但我认为 range_tester
方法更简洁。 Python 的 argparse 中是否有等效的功能?我还没找到。
试试 add_argument
的 type
参数。它可以接受任何可调用的。请参阅 perfect_square
的示例以获取灵感。
以下程序创建了一个 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.ArgumentTypeError
。这样,argparse 可以显示帮助屏幕和自定义错误消息。如果改为引发 ValueError
,如 int
内置,则会显示默认消息 "invalid int value: ...".