Метод 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
.