python argparse - 自定义错误消息

时间:2015-06-20 17:02:32

标签: python error-handling argparse

我想在使用argparse库的命令行程序中为特定使用错误生成自定义错误消息。我知道我可以通过继承argparse.ArgumentParser

来覆盖错误的一般表示
class HelpParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        sys.exit(2)

parser = HelpParser(... ...)
args = parser.parse_args()

但是当我的error方法被调用时,message已经被库格式化了。例如,

> python prog.py old stuff

usage: prog [-h] {hot,cold,rain,snow} ...
prog: error: argument subparser: invalid choice: 'old' (choose from u'hot', u'cold', u'rain', u'snow')

如何更改error:之后的内容,例如

usage: prog [-h] {hot,cold,rain,snow} ...
error: 'old' is not a valid option. select from 'hot', 'cold', 'rain', 'snow'

2 个答案:

答案 0 :(得分:4)

查看the source code,您可以通过覆盖此方法覆盖this particular错误消息:

def _check_value(self, action, value):
    # converted value must be one of the choices (if specified)
    if action.choices is not None and value not in action.choices:
        args = {'value': value,
                'choices': ', '.join(map(repr, action.choices))}
        msg = _('invalid choice: %(value)r (choose from %(choices)s)')
        raise ArgumentError(action, msg % args)

问题是如果你想覆盖所有可能的错误消息,你必须基本上重写这个模块。在检测每种类型错误的各种方法中,所有各种错误消息都是预先格式化的。

答案 1 :(得分:1)

添加到@ Gerrat的答案,_函数将导入为

from gettext import gettext as _, ngettext

正在使用gettext模块https://docs.python.org/2/library/gettext.html来启用国际化。我不熟悉那个模块,但可能你可以用它来执行一定数量的英语释义。但也许没有你想要的那么多。

错误消息通过多个级别。像_check_values这样的函数会写出基本信息。 ArgumentError在您的示例中添加了参数名称(argument subparser:)。 parser.error添加了usageprogparser.exit负责sys.exit步骤。

def error(self, message):
    ...
    self.print_usage(_sys.stderr)
    args = {'prog': self.prog, 'message': message}
    self.exit(2, _('%(prog)s: error: %(message)s\n') % args)