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')
или выдайте собственную ошибку.