想要自定义python argparse模块生成的错误

时间:2018-05-27 12:51:26

标签: python-2.7 argparse

import argparse    
parser = argparse.ArgumentParser()

group = parser.add_mutually_exclusive_group()
group.add_argument("-f", "--filepath", help="Input the file path")
group.add_argument("-d", "--dirpath", help="Input the directory path")

例如,如果我同时使用-f和-d选项,我会收到以下错误,它是由python生成的: 错误:参数-d / - dirpath:预期的一个参数

但是我想自定义错误,它应该由我定义。

1 个答案:

答案 0 :(得分:0)

2140:~/mypy$ python3 stack50552334.py
Namespace(dirpath=None, filepath=None)

当Action nargs与可用字符串不匹配时,会产生这些。虽然消息格式相同,但它是根据参数的名称自定义的:

2140:~/mypy$ python3 stack50552334.py -f
usage: stack50552334.py [-h] [-f FILEPATH | -d DIRPATH]
stack50552334.py: error: argument -f/--filepath: expected one argument
2140:~/mypy$ python3 stack50552334.py -d
usage: stack50552334.py [-h] [-f FILEPATH | -d DIRPATH]
stack50552334.py: error: argument -d/--dirpath: expected one argument
2140:~/mypy$ python3 stack50552334.py -f -d
usage: stack50552334.py [-h] [-f FILEPATH | -d DIRPATH]
stack50552334.py: error: argument -f/--filepath: expected one argument
2141:~/mypy$ python3 stack50552334.py -f foo -d
usage: stack50552334.py [-h] [-f FILEPATH | -d DIRPATH]
stack50552334.py: error: argument -d/--dirpath: expected one argument

但是当两个标志都带有预期的参数时,mutually_exclusive_group测试就会起作用,并引发自己的错误。

2141:~/mypy$ python3 stack50552334.py -f foo -d dir
usage: stack50552334.py [-h] [-f FILEPATH | -d DIRPATH]
stack50552334.py: error: argument -d/--dirpath: not allowed with argument -f/--filepath

第一类消息产生于:

def _match_argument(self, action, arg_strings_pattern):
    # match the pattern for this action to the arg strings
    nargs_pattern = self._get_nargs_pattern(action)
    match = _re.match(nargs_pattern, arg_strings_pattern)

    # raise an exception if we weren't able to find a match
    if match is None:
        nargs_errors = {
            None: _('expected one argument'),
            OPTIONAL: _('expected at most one argument'),
            ONE_OR_MORE: _('expected at least one argument'),
        }
        default = ngettext('expected %s argument',
                           'expected %s arguments',
                           action.nargs) % action.nargs
        msg = nargs_errors.get(action.nargs, default)
        raise ArgumentError(action, msg)

    # return the number of arguments matched
    return len(match.group(1))

_gettext.gettext的别名。因此,可以使用此机制自定义消息。 https://docs.python.org/3/library/gettext.html

from gettext import gettext as _, ngettext

我对这种多语言本地化没有任何经验。

{1}}错误出现在:

mutually_exclusive

同样,有 def take_action(action, argument_strings, option_string=None): ... # error if this argument is not allowed with other previously # seen arguments, assuming that actions that use the default # value don't really count as "present" if argument_values is not action.default: seen_non_default_actions.add(action) for conflict_action in action_conflicts.get(action, []): if conflict_action in seen_non_default_actions: msg = _('not allowed with argument %s') action_name = _get_action_name(conflict_action) raise ArgumentError(action, msg % action_name) 个定制的可能性。

自定义argparse.py

当然,没有什么可以阻止您修改gettext文件的副本,并放置在您自己的目录中,以便加载而不是默认文件。

解析测试后

如果argparse.py错误的措辞困扰你(而不是mutually_exclusive错误,你可以从解析器中省略该组,并在解析后进行自己的测试。如果用户提供expected one argumentargs.filepath致电args.dirpath的非默认值,或引发您自己的错误。