忽略 argparse 生成的帮助和使用消息,并在用户向程序提供无效参数时发出错误

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

假设我有一个解析器:

import argparse
def int_main():
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

    args = parser.parse_args()
    print(args.accumulate(args.integers))
    return 1

if __name__ == '__main__':
    int_main()

假设上面的Python代码保存到一个名为

prog.py
的文件中。如果我在命令行中给出错误的参数:

python prog.py a b c

它给出了这个错误消息:

usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'

在我的上下文中,我不希望生成该错误消息,例如,我希望

int_main()
如果出现任何指示解析错误的错误,则简单地返回 False。

如何做到这一点?

我试过了:

import argparse
def int_main():
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')
    try:
        args = parser.parse_args()
        # print(args.accumulate(args.integers))
    except:
        return False
    return True

if __name__ == '__main__':
    res = int_main()
    print(res)

但没有成功。

更新

似乎有一个错误:

import argparse
parser = argparse.ArgumentParser(exit_on_error=False)
try:
    parser.parse_args('invalid arguments'.split())
except argparse.ArgumentError:
    print('ArgumentError caught.')

即使设置为False,仍然存在错误,如何解决这个问题?我真的想要一个解决方案来涵盖所有可能的异常并且从不输出错误,这是因为我正在做一些单元测试,这可能会破坏事情

python argparse
1个回答
0
投票

为了使

error_on_exit
有效,必须配置解析器。这就够了:

import argparse
parser = argparse.ArgumentParser(exit_on_error=False)
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
try:
    parser.parse_args('invalid arguments'.split())
except argparse.ArgumentError:
    print('ArgumentError caught.')

按预期给予:

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