Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Из исходной документации:

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

Параметр argument конструктора - это объект Action, из которого возникает исключение. Обычно нет необходимости поднимать его вне подкласса Action, и при подклассификации его нет необходимости явно выражать его; вы обычно поднимаете 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()

Обратите внимание, что это также безопасно против неплавающих, поскольку float(string) поднимет значение ValueError для не-float, которое также вызывает ошибку недопустимого типа модулем argparse. ArgumentTypeError - это просто способ указать настраиваемое сообщение об ошибке.

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

Для взаимоисключающих параметров вы должны использовать 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 для повышения пользовательского сообщения об ошибке, которое прерывает программу и печатает на консоль.

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

Ответ 2

В то время как parser.error() - это то, что, вероятно, хочет большинство людей, также возможно использовать 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 <module>
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
argparse.ArgumentError: argument --bar: Can't be 'xyzzy'