Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我希望Python argparse抛出一个异常,而不是用法_Python_Argparse - Fatal编程技术网

我希望Python argparse抛出一个异常,而不是用法

我希望Python argparse抛出一个异常,而不是用法,python,argparse,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() 当我运行它时: $ myapp.py usage: myapp --foo foo

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

例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()
当我运行它时:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required

但是我想让它变成异常。

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

class ArgumentParserError(Exception): pass

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

parser = ThrowingArgumentParser()
parser.add_argument(...)
...

在我的例子中,argparse打印“参数太少”,然后退出。在阅读argparse代码后,我发现它在打印一些消息后只调用sys.exit()。由于sys.exit()只会引发SystemExit异常,因此您可以捕获此异常

所以试试这个,看看它是否适合你

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return

那么,您没有使用argparse来实现它的设计目的。你想做什么?改变一个伟大的库的工作方式并不是一件坏事,只是将它调整到一个特定的项目。实际上你已经可以做到了。只需捕获
SystemExit
并用其他对象替换
sys.stderr
。@jdborg:不一定是坏的,但通常是坏的。在这种情况下,我想听听你想要实现什么,很可能有更好的方法。根据你想做什么,修改论点本身可能更好。
--foo
的参数是可选的吗?您可以定义一个自定义操作来处理它吗?这些操作可能比覆盖
argparse
退出的决定更干净。我想应该是这样的。谢谢你明确的回答。我希望避免类似的事情,尽管我很高兴这是一个选择。你看,当我收到“错误:参数太少”通知时,我正试图打印帮助菜单;我的argparse安装程序需要至少一个参数才能成功运行,但我认为最好打印出这些命令,而用户不必使用“-h”参数运行脚本。类似于:
parser.set\u error(“参数太少”,方法\u处理\u错误)
如果我想要这个功能,我想我总是可以提交一个bug。谢谢是的,巴库留的评论中提到了这个选项。unittesting
test\u argparse.py
文件使用这种方法,同时重新定义
error
以创建一个
ErrorRaisingArgumentParser
类。错误消息将在stderr上抛出。有没有办法捕获它?@Raj您可以临时将stderr重定向到另一个流/文件对象,例如: