当用户传入指定选项之外的参数时,如何抑制或自定义 argparse 错误消息?
我正在编写一个脚本,要求用户在执行程序时传入一个数字(int),我使用
choices
参数定义了该数字。我了解如何使用 metavar
参数来自定义 --help
文本,但是当用户传入范围之外的值时,错误字段会转储该范围中的每个可能的值 - 对于大范围来说并不好!
这是示例脚本的代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"--ID",
type=int,
choices=range(1, 10),
required=True,
help="My helpful help text.",
metavar="",
)
args = parser.parse_args()
这是输出:
$ python3 foo.py --ID 12
usage: foo.py [-h] --ID
foo.py: error: argument --ID: invalid choice: 12 (choose from 1, 2, 3, 4, 5, 6, 7, 8, 9)
在我的实际脚本中,我会有
choices=range(1,1000000)
。如果用户输入超出该范围的数字,这不会导致有趣的错误消息,因为他们会看到一百万(负 1)个数字的转储可供选择!
如何将错误消息读为更友好的内容,例如:
$ python3 foo.py --ID 12
usage: foo.py [-h] --ID
foo.py: error: argument --ID: invalid choice: 12 (choose from {1, 9})
您可以使用专用的
Action
:
import argparse
class MyIntRange(argparse.Action):
def __call__(self, parser, namespace, values, option_steing=None):
if values not in range(1,10):
parser.exit(1, message=" should be in {1,10}")
setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument(
"--ID",
type=int,
action=MyIntRange,
required=True,
help="My helpful help text.",
metavar="",
)
args = parser.parse_args()