Сообщить об ошибке.

Синтаксис командной строки модуля argparse в Python

Синтаксис параметров и значений в командной строке.

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

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
# Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
# Namespace(foo='FOO', x=None)

Для длинных параметров командной строки (параметры с именами длиннее одного символа), параметр и значение также можно передать как один аргумент командной строки, используя = для их разделения:

>>> parser.parse_args(['--foo=FOO'])
# Namespace(foo='FOO', x=None)

Для коротких параметров (параметры длиной только один символ), параметр и его значение могут быть объединены:

>>> parser.parse_args(['-xX'])
# Namespace(foo=None, x='X')

Несколько коротких опций можно объединить вместе, используя только один префикс '-', если только последняя опция или ни одна из них, не требует значения:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
# Namespace(x=True, y=True, z='Z')

Недействительные параметры командной строки

Во время синтаксического анализа командной строки метод parser.parse_args() проверяет различные ошибки, включая неоднозначные параметры, недопустимые типы, недопустимые параметры, неправильное количество позиционных аргументов и т. д.

Когда метод обнаруживает такую ​​ошибку, он прекращает работу и выводит ошибку вместе с сообщение об использовании:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')

>>> # недопустимый тип
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'

>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar

>>> # неверное количество аргументов
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: extra arguments found: badger

Значения, содержащие символ '-'.

Метод parser.parse_args() пытается выдавать ошибки всякий раз, когда пользователь явно допустил ошибку, но некоторые ситуации по своей сути неоднозначны.

Например значение -1 определенное в командной строке может быть либо попыткой указать опцию, либо попыткой предоставить позиционный параметр. В этом случае метод .parse_args() будет действовать аккуратно: позиционные параметры командной строки могут начинаться только с - если они выглядят как отрицательные числа, а в синтаксическом анализаторе нет опций, которые выглядят как отрицательные числа.

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')

# нет параметров, похожих на отрицательное число 
# следовательно -1 считается значением или
# позиционным параметром
>>> parser.parse_args(['-x', '-1'])
# Namespace(foo=None, x='-1')

# нет параметров, похожих на отрицательное число 
# следовательно -1 и -5 считаются значениями или
# позиционными параметрами
>>> parser.parse_args(['-x', '-1', '-5'])
# Namespace(foo='-5', x='-1')

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')

# параметры, похожие на отрицательное присутствуют
# поэтому анализатор будет считать -1 опцией
>>> parser.parse_args(['-1', 'X'])
# Namespace(foo=None, one='X')

# параметры, похожие на отрицательное число присутствуют
# поэтому анализатор будет считать -2 как опцию без значения
>>> parser.parse_args(['-2'])
# usage: PROG [-h] [-1 ONE] [foo]
# PROG: error: no such option: -2

# параметры, похожие на отрицательное число присутствуют
# анализатор считает, что оба -1 являются вариантами опций
>>> parser.parse_args(['-1', '-1'])
# usage: PROG [-h] [-1 ONE] [foo]
# PROG: error: argument -1: expected one argument

Если есть позиционные параметры, которые должны начинаться с - и не похожи на отрицательные числа, то можно вставить псевдо-аргумент '--', который сообщает методу parse_args(), что все, что после этого, является позиционным аргументом:

>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)

Сокращения параметров командной строки (сопоставление префиксов).

Метод parser.parse_args() по умолчанию позволяет сокращать длинные параметры до префикса, если сокращение однозначно (префикс соответствует уникальной опции):

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
# Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
# Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
# usage: PROG [-h] [-bacon BACON] [-badger BADGER]
# PROG: error: ambiguous option: -ba could match -badger, -bacon

Ошибка возникает для параметров командной строки, которые могут давать более одного варианта при сокращении. Эту поведение можно отключить, установив в конструкторе класса argparse.ArgumentParser() для аргумента allow_abbrev значение False.