Использование 'argparse.ArgumentError' в Python

Я'd, как использовать исключение ArgumentError в argparse модуль в Python, но я могу'т выяснить, как использовать его. Подпись говорит, что это должно называться `ArgumentError(рассуждение, сообщение), но я могу'т выяснить, что "аргумент" должен быть. Я думаю, что это должна быть какая-то часть объекта парсера, но я не мог'т найти любую документацию на это.

Комментарии к вопросу (2)
Решение

Из исходной документации](https://hg.python.org/cpython/file/v3.5.2/Lib/argparse.py#l34):

ArgumentError: за исключением, поднятые объекты ArgumentParser при наличии ошибок парсера'ы действия. Ошибки, возникающие при разборе командной строки попадутся на ArgumentParser и выбрасывается в виде командной строки сообщений.

Этот "аргумент" параметр конструктора является объект "действие", из которой вызывается исключение. Как правило, нет необходимости поднимать его за "действием" подкласс, и при наследовании он, нет никакой необходимости явно поднять его; обычно поднимают ValueError (или как там это уместно), а не.

Значений с плавающей точкой между 0 и 1

Что касается вашего комментария, что вы только хотите принять плавающей запятой между 0 и 1. Для этого вы должны использовать возможность определять пользовательские типы. Вы можете сделать это например так:

def percentFloat (string):
    value = float(string)
    if value < 0 or value > 1:
        raise argparse.ArgumentTypeError('Value has to be between 0 and 1')
    return value

parser = argparse.ArgumentParser()
parser.add_argument('test', type=percentFloat)
parser.parse_args()

Обратите внимание, что это также безопасно в отношении не плавает как поплавок(строка)подниметValueErrorдля некурящих, поплавки которой также вызывает недопустимую ошибку типаargparseмодуль. [ArgumentTypeError`](https://hg.python.org/cpython/file/v3.5.2/Lib/argparse.py#l725) это просто способ, чтобы указать пользовательское сообщение об ошибке.

Взаимоисключающие параметры

Для взаимоисключающих параметров, вы должны использовать argparse.add_mutually_exclusive_group.

# Зависимость параметра#

Зависимость параметра не совсем то, что должно быть сделано аргумент парсер. Для семантического детали, вы должны просто сделать это самостоятельно:

args = parser.parse_args()
if args.w and not args.p:
    parser.error('-p is required when -w is set.')

Вы можете использовать ArgumentParser.error для повышения пользовательского сообщения об ошибке, который будет прерывать программу и распечатать на консоль.

Но, конечно, в такой ситуации это было бы сделать намного больше смысла, чтобы просто неявно предполагаю , если это возможно.

Комментарии (6)

В то время как парсер.ошибка () является то, что большинство людей, вероятно, хотите, также можно использовать argparse.ArgumentError() (как вопрос задает.) Вам нужна ссылка на аргумент, как bar_arg в примере ниже:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
bar_arg = parser.add_argument('--bar')

args = parser.parse_args()
if args.bar == 'xyzzy':
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")

if args.foo == 'xyzzy':
    parser.error("Can't be 'xyzzy'")

Этот результат, как показано ниже:

в

$ python argparse_test.py --foo xyzzy
usage: argparse_test.py [-h] [--foo FOO] [--bar BAR]
argparse_test.py: error: Can't be 'xyzzy'

$ python argparse_test.py --bar xyzzy
Traceback (most recent call last):
  File "argparse_test.py", line 10, in 
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
argparse.ArgumentError: argument --bar: Can't be 'xyzzy'
Комментарии (4)