Хотел настроить Python Argparse модуль сгенерированных ошибок - PullRequest
0 голосов
/ 27 мая 2018
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: error: аргумент -d / - dirpath: ожидается один аргумент

Но я хочу настроить ошибку, и она должна быть определена мной.

1 Ответ

0 голосов
/ 28 мая 2018
2140:~/mypy$ python3 stack50552334.py
Namespace(dirpath=None, filepath=None)

Все они создаются при несоответствии между действием 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

У меня нет опыта работы с этой многоязычной локализацией.

Ошибка 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)

Снова,есть возможность настройки gettext.

custom argparse.py

Конечно, ничто не мешает вам изменить копию файла argparse.py и поместить ее в свой собственный каталог, чтобы оназагружается вместо установленного по умолчанию.

тестирование после разбора

Если вас беспокоит формулировка ошибки mutually_exclusive (в отличие от ошибок expected one argument, вы можете опустить эту группуиз синтаксического анализатора и выполните свои собственные тесты после синтаксического анализа. Если пользователь предоставляет значения не по умолчанию для args.filepath и args.dirpath, вызовите parser.error('your own message') или выдайте собственную ошибку.

...