Argparse:如何抑制“无效选择”错误的选项列表?

问题描述 投票:0回答:1

当用户传入指定选项之外的参数时,如何抑制或自定义 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})
python argparse
1个回答
0
投票

您可以使用专用的

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()

© www.soinside.com 2019 - 2024. All rights reserved.