Из Python argparse документации
https://docs.python.org/3/library/argparse.html#exiting-methods
16.4.5.9. Exiting methods
ArgumentParser.exit(status=0, message=None)
This method terminates the program, exiting with the specified status and, if given, it prints a message before that.
ArgumentParser.error(message)
This method prints a usage message including the message to the standard error and terminates the program with a status code of 2.
Они оба получают message
, и передать его. error
добавляет usage
и передает его на номер exit
. Вы можете настроить оба в подклассе Parser.
Есть также примеры обнаружения ошибок и перенаправления файла unittest, test/test_argparse.py
.
Проблемы с использованием try/except
обертки является то, что error
информации записывается в sys.stderr
, а не включена в sys.exc_info
.
In [117]: try:
parser.parse_args(['ug'])
except:
print('execinfo:',sys.exc_info())
.....:
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
ipython3: error: the following arguments are required: test
execinfo: (<class 'SystemExit'>, SystemExit(2,), <traceback object at 0xb31fb34c>)
Номер выхода доступен в exc_info
, но не сообщение.
Один из вариантов - перенаправить sys.stderr
в то же время, что и я, try/except
блок.
Вот пример изменения метода exit
и оберточной вызов в Ьгу блоке:
In [155]:
def altexit(status, msg):
print(status, msg)
raise ValueError(msg)
.....:
In [156]: parser.exit=altexit
In [157]:
try:
parser.parse_args(['--ug','ug','ug'])
except ValueError:
msg = sys.exc_info()[1]
.....:
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
2 ipython3: error: unrecognized arguments: --ug
In [158]: msg
Out[158]: ValueError('ipython3: error: unrecognized arguments: --ug\n')
Python
позволяет мне заменить методы существующих объектов. Я не рекомендую это в производственном коде, но это удобно при попытке идеи. Я фиксирую ошибку (мой выбор ValueError произволен) и сохраните сообщение для последующего отображения или тестирования.
Как правило, тип ошибки (например, TypeError, ValueError и т. Д.) Является частью общедоступного API, но текст ошибки отсутствует. Он может быть уточнен с одного выпуска Python до следующего без особого уведомления. Таким образом, вы проверяете данные сообщения на свой страх и риск.
Вы, я знаю, что я могу переопределить ошибки argparse? Поскольку, когда параметр не распознается, он автоматически выходит с кодом ошибки 0, я хочу переопределить его, чтобы я мог его изменить, чтобы выйти с кодом 1 ... – feeloor
используйте try except block, чтобы поймать ошибку и в зависимости от выхода исключения с разные коды ... подсказка: используйте методы, такие как sys.exc_info(), чтобы обнаружить тип исключения. –