我希望Python argparse抛出异常而不是使用

jdb*_*org 36 python argparse

我不认为这是可能的,但我想自己处理来自argparse的异常.

例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()
Run Code Online (Sandbox Code Playgroud)

当我运行它:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required
Run Code Online (Sandbox Code Playgroud)

但我希望它落入例外.

Ned*_*der 66

您可以子类化ArgumentParser并覆盖该error方法,以便在发生错误时执行不同的操作:

class ArgumentParserError(Exception): pass

class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

parser = ThrowingArgumentParser()
parser.add_argument(...)
...
Run Code Online (Sandbox Code Playgroud)

  • 我希望避免这样的事情,虽然我很高兴这是一个选择.你看,当我收到"错误:参数太少"通知时,我正在尝试打印出帮助菜单; 我的argparse设置需要至少一个参数才能成功运行,但我认为打印出这些命令是不礼貌的,而用户不必使用"-h"参数运行脚本.类似的东西:`parser.set_error('参数太少',method_to_deal_with_error)`我想如果我想要这个功能,我总是可以提交一个bug.谢谢! (3认同)

Jac*_*CUI 18

在我的例子中,argparse打印"参数太少"然后退出.在阅读了argparse代码之后,我发现在打印一些消息后它只是调用sys.exit().因为sys.exit()除了抛出SystemExit异常之外什么都不做,你可以捕获这个异常.

所以试试看看它是否适合你.

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return
Run Code Online (Sandbox Code Playgroud)

  • 错误消息在stderr上抛出.有没有办法抓住它? (3认同)