Использование argparse.ArgumentError в Python - PullRequest
39 голосов
/ 13 ноября 2011

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

Ответы [ 2 ]

56 голосов
/ 13 ноября 2011

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

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()

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

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

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

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

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

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

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

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

14 голосов
/ 10 февраля 2015

Хотя 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'
...