Мне неизвестен какой-либо механизм указания кода выхода для каждого аргумента. Вы можете поймать исключение SystemExit
, сгенерированное на .parse_args()
, но я не уверен, как бы вы тогда выяснили, что именно конкретно вызвало ошибку.
РЕДАКТИРОВАТЬ: Для тех, кто приходит к этому в поисках практического решения, следующая ситуация:
ArgumentError()
соответствующим образом повышается, когда синтаксический анализ arg не удался. Передается экземпляр аргумента и сообщение
ArgumentError()
не не сохраняет аргумент как атрибут экземпляра, несмотря на его передачу (что было бы удобно)
- Можно повторно вызвать исключение
ArgumentError
путем создания подкласса ArgumentParser
, переопределения .error () и получения исключения из sys.exc_info ()
Все это означает, что следующий код - хотя и некрасивый - позволяет нам перехватить исключение ArgumentError, получить аргумент и сообщение об ошибке, вызывающие ошибку, и сделать то, что нам нужно:
import argparse
import sys
class ArgumentParser(argparse.ArgumentParser):
def _get_action_from_name(self, name):
"""Given a name, get the Action instance registered with this parser.
If only it were made available in the ArgumentError object. It is
passed as it's first arg...
"""
container = self._actions
if name is None:
return None
for action in container:
if '/'.join(action.option_strings) == name:
return action
elif action.metavar == name:
return action
elif action.dest == name:
return action
def error(self, message):
exc = sys.exc_info()[1]
if exc:
exc.argument = self._get_action_from_name(exc.argument_name)
raise exc
super(ArgumentParser, self).error(message)
## usage:
parser = ArgumentParser()
parser.add_argument('--foo', type=int)
try:
parser.parse_args(['--foo=d'])
except argparse.ArgumentError, exc:
print exc.message, '\n', exc.argument
Не проверено каким-либо полезным способом. Применяется обычное возмещение «не вини меня, если он ломает».