argparse.md
1> **Источник:** https://python-all.ru/3.2/library/argparse.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 15.4. [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) – Парсер для параметров командной строки, аргументов и подкоманд89Новое в версии 3.2.1011**Исходный код:** [Lib/argparse.py](https://python-all.ru/src/3.2/Lib/argparse.py)1213---1415Учебное пособие1617На этой странице содержится справочная информация по API. Для более плавного введения в разбор командной строки Python обратитесь к [*учебному пособию по argparse*](https://python-all.ru/3.2/howto/argparse.html#id1).1819Модуль [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) упрощает создание удобных интерфейсов командной строки. Программа определяет, какие аргументы ей нужны, а [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) разбирается, как извлечь их из [`sys.argv`](https://python-all.ru/3.2/library/sys.html#sys.argv). Модуль [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) также автоматически генерирует сообщения справки и использования, а также выдает ошибки, когда пользователь передает программе недопустимые аргументы.2021## 15.4.1. Пример2223Следующий код представляет собой программу на Python, которая принимает список целых чисел и выводит либо сумму, либо максимум:2425```python26import argparse2728parser = argparse.ArgumentParser(description='Process some integers.')29parser.add_argument('integers', metavar='N', type=int, nargs='+',30 help='an integer for the accumulator')31parser.add_argument('--sum', dest='accumulate', action='store_const',32 const=sum, default=max,33 help='sum the integers (default: find the max)')3435args = parser.parse_args()36print(args.accumulate(args.integers))37```3839Предположим, что приведенный выше код Python сохранен в файл с именем `prog.py`, его можно запустить из командной строки, и он предоставит полезные сообщения справки:4041```python42$ prog.py -h43usage: prog.py [-h] [--sum] N [N ...]4445Process some integers.4647positional arguments:48 N an integer for the accumulator4950optional arguments:51 -h, --help show this help message and exit52 --sum sum the integers (default: find the max)53```5455При запуске с соответствующими аргументами программа выводит либо сумму, либо максимум переданных целых чисел:5657```python58$ prog.py 1 2 3 45946061$ prog.py 1 2 3 4 --sum621063```6465Если передать неверные аргументы, будет выдана ошибка:6667```python68$ prog.py a b c69usage: prog.py [-h] [--sum] N [N ...]70prog.py: error: argument N: invalid int value: 'a'71```7273В следующих разделах этот пример разбирается подробно.7475### 15.4.1.1. Создание парсера7677Первый шаг при использовании [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) – создать объект [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):7879```python80>>> parser = argparse.ArgumentParser(description='Process some integers.')81```8283Объект [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) будет содержать всю информацию, необходимую для синтаксического разбора командной строки в типы данных Python.8485### 15.4.1.2. Добавление аргументов8687Наполнение объекта [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) информацией об аргументах программы осуществляется вызовами метода [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument). В общем случае эти вызовы сообщают [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), как преобразовать строки командной строки в объекты. Эта информация сохраняется и используется при вызове [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). Например:8889```python90>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',91... help='an integer for the accumulator')92>>> parser.add_argument('--sum', dest='accumulate', action='store_const',93... const=sum, default=max,94... help='sum the integers (default: find the max)')95```9697При последующем вызове [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) возвращается объект с двумя атрибутами: `integers` и `accumulate`. Атрибут `integers` будет списком из одного или нескольких целых чисел, а атрибут `accumulate` будет либо функцией [`sum()`](https://python-all.ru/3.2/library/functions.html#sum), если в командной строке был указан флаг `--sum`, либо функцией [`max()`](https://python-all.ru/3.2/library/functions.html#max), если не был.9899### 15.4.1.3. Разбор аргументов100101[`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) разбирает аргументы с помощью метода [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). Он анализирует командную строку, преобразует каждый аргумент в соответствующий тип и затем выполняет соответствующее действие. В большинстве случаев это означает, что будет построен простой объект [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace) из атрибутов, выделенных из командной строки:102103```python104>>> parser.parse_args(['--sum', '7', '-1', '42'])105Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])106```107108В скрипте [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) обычно вызывается без аргументов, и [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) автоматически определяет аргументы командной строки из [`sys.argv`](https://python-all.ru/3.2/library/sys.html#sys.argv).109110## 15.4.2. Объекты ArgumentParser111112#### `class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)`113114Создаёт новый объект [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Каждый параметр имеет собственное более подробное описание ниже, но вкратце они:115116- [description](https://python-all.ru/3.2/library/argparse.html#description) - Текст, отображаемый перед справкой по аргументам.117- [epilog](https://python-all.ru/3.2/library/argparse.html#epilog) - Текст, отображаемый после справки по аргументам.118- [add\_help](https://python-all.ru/3.2/library/argparse.html#add-help) - Добавить опцию -h/--help в парсер. (значение по умолчанию: `True`)119- [argument\_default](https://python-all.ru/3.2/library/argparse.html#argument-default) - Устанавливает глобальное значение по умолчанию для аргументов. (значение по умолчанию: `None`)120- [parents](https://python-all.ru/3.2/library/argparse.html#parents) - Список объектов [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), чьи аргументы также должны быть включены.121- [prefix\_chars](https://python-all.ru/3.2/library/argparse.html#prefix-chars) - Набор символов, которые являются префиксом необязательных аргументов. (значение по умолчанию: ‘-‘)122- [fromfile\_prefix\_chars](https://python-all.ru/3.2/library/argparse.html#fromfile-prefix-chars) - Набор символов, которые являются префиксом файлов, из которых должны быть прочитаны дополнительные аргументы. (значение по умолчанию: `None`)123- [formatter\_class](https://python-all.ru/3.2/library/argparse.html#formatter-class) - Класс для настройки вывода справки.124- [conflict\_handler](https://python-all.ru/3.2/library/argparse.html#conflict-handler) - Обычно не требуется, определяет стратегию разрешения конфликтующих опциональных аргументов.125- [prog](https://python-all.ru/3.2/library/argparse.html#prog) - Имя программы (значение по умолчанию: `sys.argv[0]`)126- [usage](https://python-all.ru/3.2/library/argparse.html#usage) - Строка, описывающая использование программы (значение по умолчанию: генерируется)127128В следующих разделах описывается, как используется каждый из этих параметров.129130### 15.4.2.1. description131132Большинство вызовов конструктора [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) используют именованный аргумент `description=`. Этот аргумент задаёт краткое описание того, что делает программа и как она работает. В сообщениях справки описание отображается между строкой использования командной строки и сообщениями справки для различных аргументов:133134```python135>>> parser = argparse.ArgumentParser(description='A foo that bars')136>>> parser.print_help()137usage: argparse.py [-h]138139A foo that bars140141optional arguments:142 -h, --help show this help message and exit143```144145По умолчанию описание переносится по строкам, чтобы уместиться в отведённом пространстве. Чтобы изменить это поведение, обратитесь к аргументу [formatter\_class](https://python-all.ru/3.2/library/argparse.html#formatter-class).146147### 15.4.2.2. epilog148149Некоторые программы предпочитают отображать дополнительное описание после описания аргументов. Такой текст можно указать с помощью аргумента `epilog=` для [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):150151```python152>>> parser = argparse.ArgumentParser(153... description='A foo that bars',154... epilog="And that's how you'd foo a bar")155>>> parser.print_help()156usage: argparse.py [-h]157158A foo that bars159160optional arguments:161 -h, --help show this help message and exit162163And that's how you'd foo a bar164```165166Как и для аргумента [description](https://python-all.ru/3.2/library/argparse.html#description), текст `epilog=` по умолчанию переносится по строкам, но это поведение можно настроить с помощью аргумента [formatter\_class](https://python-all.ru/3.2/library/argparse.html#formatter-class) для [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser).167168### 15.4.2.3. add\_help169170По умолчанию объекты ArgumentParser добавляют опцию, которая просто отображает справочное сообщение парсера. Например, рассмотрим файл с именем `myprogram.py`, содержащий следующий код:171172```python173import argparse174parser = argparse.ArgumentParser()175parser.add_argument('--foo', help='foo help')176args = parser.parse_args()177```178179Если в командной строке указать `-h` или `--help`, будет выведена справка ArgumentParser:180181```python182$ python myprogram.py --help183usage: myprogram.py [-h] [--foo FOO]184185optional arguments:186 -h, --help show this help message and exit187 --foo FOO foo help188```189190Иногда может быть полезно отключить добавление этой опции справки. Это можно сделать, передав `False` в качестве аргумента `add_help=` в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):191192```python193>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)194>>> parser.add_argument('--foo', help='foo help')195>>> parser.print_help()196usage: PROG [--foo FOO]197198optional arguments:199 --foo FOO foo help200```201202Опция справки обычно имеет вид `-h/--help`. Исключением является случай, когда указан `prefix_chars=` и он не включает `-`; в этом случае `-h` и `--help` не являются допустимыми опциями. В таком случае первый символ в `prefix_chars` используется в качестве префикса для опций справки:203204```python205>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')206>>> parser.print_help()207usage: PROG [+h]208209optional arguments:210 +h, ++help show this help message and exit211```212213### 15.4.2.4. prefix\_chars214215Большинство опций командной строки используют префикс `-`, например, `-f/--foo`. Парсеры, которым требуется поддержка других или дополнительных символов префикса, например, для опций вроде `+f` или `/foo`, могут указать их с помощью аргумента `prefix_chars=` конструктора ArgumentParser:216217```python218>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')219>>> parser.add_argument('+f')220>>> parser.add_argument('++bar')221>>> parser.parse_args('+f X ++bar Y'.split())222Namespace(bar='Y', f='X')223```224225Аргумент `prefix_chars=` по умолчанию равен `'-'`. Если указать набор символов, не включающий `-`, то опции `-f/--foo` будут запрещены.226227### 15.4.2.5. fromfile\_prefix\_chars228229Иногда, например, при работе с особенно длинными списками аргументов, может иметь смысл хранить список аргументов в файле, а не вводить его в командной строке. Если аргумент `fromfile_prefix_chars=` передан конструктору [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), то аргументы, начинающиеся с любого из указанных символов, будут рассматриваться как файлы и заменяться на содержащиеся в них аргументы. Например:230231```python232>>> with open('args.txt', 'w') as fp:233... fp.write('-f\nbar')234>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')235>>> parser.add_argument('-f')236>>> parser.parse_args(['-f', 'foo', '@args.txt'])237Namespace(f='bar')238```239240Аргументы, читаемые из файла, по умолчанию должны быть по одному на строку (но см. также [`convert_arg_line_to_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args)) и обрабатываются так, как если бы они находились на том же месте, что и исходный аргумент, ссылающийся на файл, в командной строке. Таким образом, в приведённом выше примере выражение `['-f', 'foo', '@args.txt']` считается эквивалентным выражению `['-f', 'foo', '-f', 'bar']`.241242Аргумент `fromfile_prefix_chars=` по умолчанию равен `None`, то есть аргументы никогда не будут рассматриваться как ссылки на файлы.243244### 15.4.2.6. argument\_default245246Обычно значения аргументов по умолчанию задаются либо передачей значения по умолчанию в [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), либо вызовом методов [`set_defaults()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.set_defaults) с определённым набором пар имя-значение. Однако иногда бывает полезно задать единое для всего парсера значение по умолчанию для аргументов. Это можно сделать, передав ключевой аргумент `argument_default=` в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Например, чтобы глобально подавить создание атрибутов при вызовах [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), укажите `argument_default=SUPPRESS`:247248```python249>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)250>>> parser.add_argument('--foo')251>>> parser.add_argument('bar', nargs='?')252>>> parser.parse_args(['--foo', '1', 'BAR'])253Namespace(bar='BAR', foo='1')254>>> parser.parse_args([])255Namespace()256```257258### 15.4.2.7. parents259260Иногда несколько парсеров используют общий набор аргументов. Вместо повторения определений этих аргументов можно использовать один парсер со всеми общими аргументами, который передаётся аргументу `parents=` в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Аргумент `parents=` принимает список объектов [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), собирает все позиционные и опциональные действия из них и добавляет эти действия к создаваемому объекту [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):261262```python263>>> parent_parser = argparse.ArgumentParser(add_help=False)264>>> parent_parser.add_argument('--parent', type=int)265266>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])267>>> foo_parser.add_argument('foo')268>>> foo_parser.parse_args(['--parent', '2', 'XXX'])269Namespace(foo='XXX', parent=2)270271>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])272>>> bar_parser.add_argument('--bar')273>>> bar_parser.parse_args(['--bar', 'YYY'])274Namespace(bar='YYY', parent=None)275```276277Обратите внимание, что большинство родительских парсеров указывают `add_help=False`. В противном случае [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) увидит две опции `-h/--help` (одну в родительском, другую в дочернем) и вызовет ошибку.278279> **Примечание**280>281> Парсеры должны быть полностью инициализированы перед передачей через `parents=`. Если изменить родительские парсеры после создания дочернего, эти изменения не отразятся в дочернем.282283### 15.4.2.8. formatter\_class284285Объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) позволяют настраивать форматирование справки, указывая альтернативный класс форматирования. В настоящее время существует три таких класса:286287#### `class argparse.RawDescriptionHelpFormatter`288289#### `class argparse.RawTextHelpFormatter`290291#### `class argparse.ArgumentDefaultsHelpFormatter`292293Первые два позволяют больше контролировать отображение текстовых описаний, в то время как последний автоматически добавляет информацию о значениях по умолчанию аргументов.294295По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) выполняют перенос по строкам текстов [description](https://python-all.ru/3.2/library/argparse.html#description) и [epilog](https://python-all.ru/3.2/library/argparse.html#epilog) в сообщениях справки командной строки:296297```python298>>> parser = argparse.ArgumentParser(299... prog='PROG',300... description='''this description301... was indented weird302... but that is okay''',303... epilog='''304... likewise for this epilog whose whitespace will305... be cleaned up and whose words will be wrapped306... across a couple lines''')307>>> parser.print_help()308usage: PROG [-h]309310this description was indented weird but that is okay311312optional arguments:313 -h, --help show this help message and exit314315likewise for this epilog whose whitespace will be cleaned up and whose words316will be wrapped across a couple lines317```318319Передача [`RawDescriptionHelpFormatter`](https://python-all.ru/3.2/library/argparse.html#argparse.RawDescriptionHelpFormatter) в качестве `formatter_class=` указывает, что [description](https://python-all.ru/3.2/library/argparse.html#description) и [epilog](https://python-all.ru/3.2/library/argparse.html#epilog) уже правильно отформатированы и не должны переноситься по строкам:320321```python322>>> parser = argparse.ArgumentParser(323... prog='PROG',324... formatter_class=argparse.RawDescriptionHelpFormatter,325... description=textwrap.dedent('''\326... Please do not mess up this text!327... --------------------------------328... I have indented it329... exactly the way330... I want it331... '''))332>>> parser.print_help()333usage: PROG [-h]334335Please do not mess up this text!336--------------------------------337 I have indented it338 exactly the way339 I want it340341optional arguments:342 -h, --help show this help message and exit343```344345[`RawTextHelpFormatter`](https://python-all.ru/3.2/library/argparse.html#argparse.RawTextHelpFormatter) сохраняет пробелы для всех видов текста справки, включая описания аргументов.346347Другой доступный класс форматирования, [`ArgumentDefaultsHelpFormatter`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter), добавит информацию о значении по умолчанию каждого из аргументов:348349```python350>>> parser = argparse.ArgumentParser(351... prog='PROG',352... formatter_class=argparse.ArgumentDefaultsHelpFormatter)353>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')354>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')355>>> parser.print_help()356usage: PROG [-h] [--foo FOO] [bar [bar ...]]357358positional arguments:359 bar BAR! (default: [1, 2, 3])360361optional arguments:362 -h, --help show this help message and exit363 --foo FOO FOO! (default: 42)364```365366### 15.4.2.9. conflict\_handler367368Объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) не допускают двух действий с одинаковой строкой опции. По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) вызывают исключение при попытке создать аргумент со строкой опции, которая уже используется:369370```python371>>> parser = argparse.ArgumentParser(prog='PROG')372>>> parser.add_argument('-f', '--foo', help='old foo help')373>>> parser.add_argument('--foo', help='new foo help')374Traceback (most recent call last):375 ..376ArgumentError: argument --foo: conflicting option string(s): --foo377```378379Иногда (например, при использовании [parents](https://python-all.ru/3.2/library/argparse.html#parents)) может быть полезно просто переопределить любые старые аргументы с той же строкой опции. Чтобы получить такое поведение, можно передать значение `'resolve'` аргументу `conflict_handler=` объекта [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):380381```python382>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')383>>> parser.add_argument('-f', '--foo', help='old foo help')384>>> parser.add_argument('--foo', help='new foo help')385>>> parser.print_help()386usage: PROG [-h] [-f FOO] [--foo FOO]387388optional arguments:389 -h, --help show this help message and exit390 -f FOO old foo help391 --foo FOO new foo help392```393394Обратите внимание, что объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) удаляют действие только если все его строки опций переопределены. Так, в примере выше старое действие `-f/--foo` сохраняется как действие `-f`, потому что была переопределена только строка опции `--foo`.395396### 15.4.2.10. prog397398По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) используют `sys.argv[0]` для определения того, как отображать имя программы в сообщениях справки. Это значение по умолчанию почти всегда желательно, поскольку оно позволяет сообщениям справки соответствовать тому, как программа была вызвана в командной строке. Например, рассмотрим файл с именем `myprogram.py` со следующим кодом:399400```python401import argparse402parser = argparse.ArgumentParser()403parser.add_argument('--foo', help='foo help')404args = parser.parse_args()405```406407Справка для этой программы будет отображать `myprogram.py` в качестве имени программы (независимо от того, откуда была вызвана программа):408409```python410$ python myprogram.py --help411usage: myprogram.py [-h] [--foo FOO]412413optional arguments:414 -h, --help show this help message and exit415 --foo FOO foo help416$ cd ..417$ python subdir\myprogram.py --help418usage: myprogram.py [-h] [--foo FOO]419420optional arguments:421 -h, --help show this help message and exit422 --foo FOO foo help423```424425Чтобы изменить это поведение по умолчанию, можно указать другое значение с помощью аргумента `prog=` для [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser):426427```python428>>> parser = argparse.ArgumentParser(prog='myprogram')429>>> parser.print_help()430usage: myprogram [-h]431432optional arguments:433 -h, --help show this help message and exit434```435436Обратите внимание, что имя программы – определённое из `sys.argv[0]` или из аргумента `prog=` – доступно в сообщениях справки с помощью спецификатора формата `%(prog)s`.437438```python439>>> parser = argparse.ArgumentParser(prog='myprogram')440>>> parser.add_argument('--foo', help='foo of the %(prog)s program')441>>> parser.print_help()442usage: myprogram [-h] [--foo FOO]443444optional arguments:445 -h, --help show this help message and exit446 --foo FOO foo of the myprogram program447```448449### 15.4.2.11. usage450451По умолчанию [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) вычисляет сообщение об использовании из содержащихся в нём аргументов:452453```python454>>> parser = argparse.ArgumentParser(prog='PROG')455>>> parser.add_argument('--foo', nargs='?', help='foo help')456>>> parser.add_argument('bar', nargs='+', help='bar help')457>>> parser.print_help()458usage: PROG [-h] [--foo [FOO]] bar [bar ...]459460positional arguments:461 bar bar help462463optional arguments:464 -h, --help show this help message and exit465 --foo [FOO] foo help466```467468Сообщение по умолчанию можно переопределить с помощью именованного аргумента `usage=`:469470```python471>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')472>>> parser.add_argument('--foo', nargs='?', help='foo help')473>>> parser.add_argument('bar', nargs='+', help='bar help')474>>> parser.print_help()475usage: PROG [options]476477positional arguments:478 bar bar help479480optional arguments:481 -h, --help show this help message and exit482 --foo [FOO] foo help483```484485Спецификатор формата `%(prog)s` доступен для подстановки имени программы в сообщения об использовании.486487## 15.4.3. Метод add\_argument()488489#### `ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])`490491Определяет, как должен разбираться один аргумент командной строки. Каждый параметр подробно описан ниже, а кратко они таковы:492493- [имя или флаги](https://python-all.ru/3.2/library/argparse.html#name-or-flags) – Имя или список строк параметров, например `foo` или `-f, --foo`.494- [action](https://python-all.ru/3.2/library/argparse.html#action) – базовый тип действия, которое выполняется при встрече этого аргумента в командной строке.495- [nargs](https://python-all.ru/3.2/library/argparse.html#nargs) – количество аргументов командной строки, которое должно быть потреблено.496- [const](https://python-all.ru/3.2/library/argparse.html#const) – постоянное значение, требуемое некоторыми значениями [action](https://python-all.ru/3.2/library/argparse.html#action) и [nargs](https://python-all.ru/3.2/library/argparse.html#nargs).497- [default](https://python-all.ru/3.2/library/argparse.html#default) – Значение, создаваемое, если аргумент отсутствует в командной строке.498- [type](https://python-all.ru/3.2/library/argparse.html#type) – тип, в который следует преобразовать аргумент командной строки.499- [choices](https://python-all.ru/3.2/library/argparse.html#choices) – Контейнер допустимых значений для аргумента.500- [required](https://python-all.ru/3.2/library/argparse.html#required) – может ли параметр командной строки быть опущен (только для опциональных параметров).501- [help](https://python-all.ru/3.2/library/argparse.html#help) – краткое описание того, что делает аргумент.502- [metavar](https://python-all.ru/3.2/library/argparse.html#metavar) – имя аргумента в сообщениях об использовании.503- [dest](https://python-all.ru/3.2/library/argparse.html#dest) – Имя атрибута, который будет добавлен к объекту, возвращаемому [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args).504505В следующих разделах описывается, как используется каждый из этих параметров.506507### 15.4.3.1. name или flags508509Метод [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) должен знать, ожидается ли необязательный аргумент, например `-f` или `--foo`, или позиционный аргумент, например список имен файлов. Поэтому первые аргументы, передаваемые в [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), должны быть либо серией флагов, либо простым именем аргумента. Например, необязательный аргумент можно создать так:510511```python512>>> parser.add_argument('-f', '--foo')513```514515а позиционный – так:516517```python518>>> parser.add_argument('bar')519```520521Когда вызывается [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), необязательные аргументы будут определяться по префиксу `-`, а остальные аргументы будут считаться позиционными:522523```python524>>> parser = argparse.ArgumentParser(prog='PROG')525>>> parser.add_argument('-f', '--foo')526>>> parser.add_argument('bar')527>>> parser.parse_args(['BAR'])528Namespace(bar='BAR', foo=None)529>>> parser.parse_args(['BAR', '--foo', 'FOO'])530Namespace(bar='BAR', foo='FOO')531>>> parser.parse_args(['--foo', 'FOO'])532usage: PROG [-h] [-f FOO] bar533PROG: error: too few arguments534```535536### 15.4.3.2. action537538Объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) связывают аргументы командной строки с действиями. Эти действия могут делать почти что угодно с связанными с ними аргументами командной строки, хотя большинство действий просто добавляют атрибут к объекту, возвращаемому [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). Аргумент-ключевое слово `action` определяет, как должны обрабатываться аргументы командной строки. Предоставляются следующие действия:539540- `'store'` – Просто сохраняет значение аргумента. Это действие по умолчанию. Например:541542 ```python543 >>> parser = argparse.ArgumentParser()544 >>> parser.add_argument('--foo')545 >>> parser.parse_args('--foo 1'.split())546 Namespace(foo='1')547 ```548- `'store_const'` – Сохраняет значение, указанное аргументом-ключевым словом [const](https://python-all.ru/3.2/library/argparse.html#const). (Обратите внимание, что аргумент-ключевое слово [const](https://python-all.ru/3.2/library/argparse.html#const) по умолчанию равен довольно бесполезному `None`.) Действие `'store_const'` чаще всего используется с необязательными аргументами, задающими какой-либо флаг. Например:549550 ```python551 >>> parser = argparse.ArgumentParser()552 >>> parser.add_argument('--foo', action='store_const', const=42)553 >>> parser.parse_args('--foo'.split())554 Namespace(foo=42)555 ```556- `'store_true'` и `'store_false'` – Сохраняют значения `True` и `False` соответственно. Это частные случаи `'store_const'`. Например:557558 ```python559 >>> parser = argparse.ArgumentParser()560 >>> parser.add_argument('--foo', action='store_true')561 >>> parser.add_argument('--bar', action='store_false')562 >>> parser.parse_args('--foo --bar'.split())563 Namespace(bar=False, foo=True)564 ```565- `'append'` – Сохраняет список и добавляет каждое значение аргумента в этот список. Это полезно, чтобы позволить указывать параметр несколько раз. Пример использования:566567 ```python568 >>> parser = argparse.ArgumentParser()569 >>> parser.add_argument('--foo', action='append')570 >>> parser.parse_args('--foo 1 --foo 2'.split())571 Namespace(foo=['1', '2'])572 ```573- `'append_const'` – Сохраняет список и добавляет в него значение, указанное аргументом-ключевым словом [const](https://python-all.ru/3.2/library/argparse.html#const). (Обратите внимание, что аргумент-ключевое слово [const](https://python-all.ru/3.2/library/argparse.html#const) по умолчанию равен `None`.) Действие `'append_const'` обычно полезно, когда нескольким аргументам нужно сохранять константы в один и тот же список. Например:574575 ```python576 >>> parser = argparse.ArgumentParser()577 >>> parser.add_argument('--str', dest='types', action='append_const', const=str)578 >>> parser.add_argument('--int', dest='types', action='append_const', const=int)579 >>> parser.parse_args('--str --int'.split())580 Namespace(types=[<class 'str'>, <class 'int'>])581 ```582- `'count'` – Подсчитывает количество появлений аргумента-ключевого слова. Например, это полезно для повышения уровня подробности вывода:583584 ```python585 >>> parser = argparse.ArgumentParser()586 >>> parser.add_argument('--verbose', '-v', action='count')587 >>> parser.parse_args('-vvv'.split())588 Namespace(verbose=3)589 ```590- `'help'` – Выводит полное сообщение справки для всех параметров текущего парсера и завершает работу. По умолчанию действие help автоматически добавляется к парсеру. Подробнее о том, как создается вывод, см. в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser).591- `'version'` – Ожидает аргумент-ключевое слово `version=` в вызове [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) и выводит информацию о версии и завершает работу при вызове:592593 ```python594 >>> import argparse595 >>> parser = argparse.ArgumentParser(prog='PROG')596 >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')597 >>> parser.parse_args(['--version'])598 PROG 2.0599 ```600601Вы также можете указать произвольное действие, передав подкласс Action или другой объект, реализующий тот же интерфейс. Рекомендуемый способ – расширить `Action`, переопределив метод `__call__` и, при необходимости, метод `__init__`.602603Пример пользовательского действия:604605```python606>>> class FooAction(argparse.Action):607... def __init__(self, option_strings, dest, nargs=None, **kwargs):608... if nargs is not None:609... raise ValueError("nargs not allowed")610... super(FooAction, self).__init__(option_strings, dest, **kwargs)611... def __call__(self, parser, namespace, values, option_string=None):612... print('%r %r %r' % (namespace, values, option_string))613... setattr(namespace, self.dest, values)614...615>>> parser = argparse.ArgumentParser()616>>> parser.add_argument('--foo', action=FooAction)617>>> parser.add_argument('bar', action=FooAction)618>>> args = parser.parse_args('1 --foo 2'.split())619Namespace(bar=None, foo=None) '1' None620Namespace(bar='1', foo=None) '2' '--foo'621>>> args622Namespace(bar='1', foo='2')623```624625Подробнее см. `Action`.626627### 15.4.3.3. nargs628629Объекты ArgumentParser обычно связывают один аргумент командной строки с одним действием. Аргумент-ключевое слово `nargs` связывает другое количество аргументов командной строки с одним действием. Поддерживаемые значения:630631- `N` (целое число). `N` аргументов из командной строки будут собраны вместе в список. Например:632633 ```python634 >>> parser = argparse.ArgumentParser()635 >>> parser.add_argument('--foo', nargs=2)636 >>> parser.add_argument('bar', nargs=1)637 >>> parser.parse_args('c --foo a b'.split())638 Namespace(bar=['c'], foo=['a', 'b'])639 ```640641 Обратите внимание, что `nargs=1` создает список из одного элемента. Это отличается от поведения по умолчанию, при котором элемент создается сам по себе.642- `'?'`. Если возможно, будет потреблён один аргумент командной строки и выдан как отдельный элемент. Если аргумент командной строки отсутствует, будет выдано значение из [default](https://python-all.ru/3.2/library/argparse.html#default). Обратите внимание, что для необязательных аргументов есть дополнительный случай: строка параметра присутствует, но за ней не следует аргумент командной строки. В этом случае будет выдано значение из [const](https://python-all.ru/3.2/library/argparse.html#const). Некоторые примеры для иллюстрации:643644 ```python645 >>> parser = argparse.ArgumentParser()646 >>> parser.add_argument('--foo', nargs='?', const='c', default='d')647 >>> parser.add_argument('bar', nargs='?', default='d')648 >>> parser.parse_args('XX --foo YY'.split())649 Namespace(bar='XX', foo='YY')650 >>> parser.parse_args('XX --foo'.split())651 Namespace(bar='XX', foo='c')652 >>> parser.parse_args(''.split())653 Namespace(bar='d', foo='d')654 ```655656 Одно из наиболее распространенных применений `nargs='?'` – это разрешение необязательных входных и выходных файлов:657658 ```python659 >>> parser = argparse.ArgumentParser()660 >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),661 ... default=sys.stdin)662 >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),663 ... default=sys.stdout)664 >>> parser.parse_args(['input.txt', 'output.txt'])665 Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,666 outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)667 >>> parser.parse_args([])668 Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,669 outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)670 ```671- `'*'`. Все имеющиеся аргументы командной строки собираются в список. Обратите внимание, что обычно нет большого смысла иметь более одного позиционного аргумента с `nargs='*'`, но несколько необязательных аргументов с `nargs='*'` – это возможно. Например:672673 ```python674 >>> parser = argparse.ArgumentParser()675 >>> parser.add_argument('--foo', nargs='*')676 >>> parser.add_argument('--bar', nargs='*')677 >>> parser.add_argument('baz', nargs='*')678 >>> parser.parse_args('a b --foo x y --bar 1 2'.split())679 Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])680 ```681- `'+'`. Как и `'*'`, все присутствующие аргументы командной строки собираются в список. Кроме того, будет выдано сообщение об ошибке, если не было хотя бы одного аргумента командной строки. Например:682683 ```python684 >>> parser = argparse.ArgumentParser(prog='PROG')685 >>> parser.add_argument('foo', nargs='+')686 >>> parser.parse_args('a b'.split())687 Namespace(foo=['a', 'b'])688 >>> parser.parse_args(''.split())689 usage: PROG [-h] foo [foo ...]690 PROG: error: too few arguments691 ```692- `argparse.REMAINDER`. Все оставшиеся аргументы командной строки собираются в список. Это часто полезно для утилит командной строки, которые передают управление другим утилитам командной строки:693694 ```python695 >>> parser = argparse.ArgumentParser(prog='PROG')696 >>> parser.add_argument('--foo')697 >>> parser.add_argument('command')698 >>> parser.add_argument('args', nargs=argparse.REMAINDER)699 >>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))700 Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')701 ```702703Если аргумент-ключевое слово `nargs` не указан, количество потребляемых аргументов определяется действием [action](https://python-all.ru/3.2/library/argparse.html#action). Обычно это означает, что будет потреблен один аргумент командной строки и создан один элемент (не список).704705### 15.4.3.4. const706707Аргумент `const` функции [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) используется для хранения постоянных значений, которые не считываются из командной строки, но требуются для различных действий [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Два наиболее распространенных применения:708709- Когда [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) вызывается с `action='store_const'` или `action='append_const'`. Эти действия добавляют значение `const` к одному из атрибутов объекта, возвращаемого [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). См. описание [action](https://python-all.ru/3.2/library/argparse.html#action) для примеров.710- Когда [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) вызывается со строками параметров (например, `-f` или `--foo`) и `nargs='?'`. Это создает необязательный аргумент, за которым может следовать ноль или один аргумент командной строки. При разборе командной строки, если строка параметра встречается без следующего за ней аргумента командной строки, вместо него будет использовано значение `const`. См. описание [nargs](https://python-all.ru/3.2/library/argparse.html#nargs) для примеров.711712Аргумент-ключевое слово `const` по умолчанию равен `None`.713714### 15.4.3.5. default715716Все необязательные аргументы и некоторые позиционные аргументы могут быть опущены в командной строке. Аргумент-ключевое слово `default` функции [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), значение которого по умолчанию равно `None`, определяет, какое значение следует использовать, если аргумент командной строки отсутствует. Для необязательных аргументов значение `default` используется, когда строка параметра не присутствовала в командной строке:717718```python719>>> parser = argparse.ArgumentParser()720>>> parser.add_argument('--foo', default=42)721>>> parser.parse_args('--foo 2'.split())722Namespace(foo='2')723>>> parser.parse_args(''.split())724Namespace(foo=42)725```726727Если значением `default` является строка, анализатор разбирает его так, как если бы это был аргумент командной строки. В частности, анализатор применяет любой аргумент преобразования [type](https://python-all.ru/3.2/library/argparse.html#type), если он указан, перед установкой атрибута в возвращаемом значении [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace). В противном случае анализатор использует значение как есть:728729```python730>>> parser = argparse.ArgumentParser()731>>> parser.add_argument('--length', default='10', type=int)732>>> parser.add_argument('--width', default=10.5, type=int)733>>> parser.parse_args()734Namespace(length=10, width=10.5)735```736737Для позиционных аргументов с [nargs](https://python-all.ru/3.2/library/argparse.html#nargs) равным `?` или `*` значение `default` используется, когда аргумент командной строки отсутствовал:738739```python740>>> parser = argparse.ArgumentParser()741>>> parser.add_argument('foo', nargs='?', default=42)742>>> parser.parse_args('a'.split())743Namespace(foo='a')744>>> parser.parse_args(''.split())745Namespace(foo=42)746```747748Указание `default=argparse.SUPPRESS` приводит к тому, что атрибут не добавляется, если аргумент командной строки отсутствовал.:749750```python751>>> parser = argparse.ArgumentParser()752>>> parser.add_argument('--foo', default=argparse.SUPPRESS)753>>> parser.parse_args([])754Namespace()755>>> parser.parse_args(['--foo', '1'])756Namespace(foo='1')757```758759### 15.4.3.6. type760761По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) читают аргументы командной строки как простые строки. Однако довольно часто строку командной строки следует интерпретировать как другой тип, например [`float`](https://python-all.ru/3.2/library/functions.html#float) или [`int`](https://python-all.ru/3.2/library/functions.html#int). Именованный аргумент `type` функции [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) позволяет выполнять любые необходимые проверки и преобразования типов. Встроенные типы и функции могут использоваться непосредственно как значение аргумента `type`:762763```python764>>> parser = argparse.ArgumentParser()765>>> parser.add_argument('foo', type=int)766>>> parser.add_argument('bar', type=open)767>>> parser.parse_args('2 temp.txt'.split())768Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)769```770771Смотрите раздел об именованном аргументе [default](https://python-all.ru/3.2/library/argparse.html#default) для получения информации о том, когда аргумент `type` применяется к значениям по умолчанию.772773Чтобы упростить использование различных типов файлов, модуль argparse предоставляет фабрику FileType, которая принимает аргументы `mode=` и `bufsize=` функции [`open()`](https://python-all.ru/3.2/library/functions.html#open). Например, `FileType('w')` можно использовать для создания файла для записи:774775```python776>>> parser = argparse.ArgumentParser()777>>> parser.add_argument('bar', type=argparse.FileType('w'))778>>> parser.parse_args(['out.txt'])779Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>)780```781782`type=` может принимать любой вызываемый объект, который принимает один строковый аргумент и возвращает преобразованное значение:783784```python785>>> def perfect_square(string):786... value = int(string)787... sqrt = math.sqrt(value)788... if sqrt != int(sqrt):789... msg = "%r is not a perfect square" % string790... raise argparse.ArgumentTypeError(msg)791... return value792...793>>> parser = argparse.ArgumentParser(prog='PROG')794>>> parser.add_argument('foo', type=perfect_square)795>>> parser.parse_args('9'.split())796Namespace(foo=9)797>>> parser.parse_args('7'.split())798usage: PROG [-h] foo799PROG: error: argument foo: '7' is not a perfect square800```801802Ключевой аргумент [choices](https://python-all.ru/3.2/library/argparse.html#choices) может быть удобнее для проверок типов, которые просто проверяют попадание в диапазон значений:803804```python805>>> parser = argparse.ArgumentParser(prog='PROG')806>>> parser.add_argument('foo', type=int, choices=range(5, 10))807>>> parser.parse_args('7'.split())808Namespace(foo=7)809>>> parser.parse_args('11'.split())810usage: PROG [-h] {5,6,7,8,9}811PROG: error: argument foo: invalid choice: 11 (choose from 5, 6, 7, 8, 9)812```813814См. раздел [choices](https://python-all.ru/3.2/library/argparse.html#choices) для получения дополнительных сведений.815816### 15.4.3.7. choices817818Some command-line arguments should be selected from a restricted set of values. These can be handled by passing a container object as the *choices* keyword argument to [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument). When the command line is parsed, argument values will be checked, and an error message will be displayed if the argument was not one of the acceptable values:819820```python821>>> parser = argparse.ArgumentParser(prog='game.py')822>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])823>>> parser.parse_args(['rock'])824Namespace(move='rock')825>>> parser.parse_args(['fire'])826usage: game.py [-h] {rock,paper,scissors}827game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',828'paper', 'scissors')829```830831Обратите внимание: вхождение в контейнер *choices* проверяется после всех преобразований типа [type](https://python-all.ru/3.2/library/argparse.html#type), поэтому тип объектов в *choices* должен соответствовать указанному [type](https://python-all.ru/3.2/library/argparse.html#type):832833```python834>>> parser = argparse.ArgumentParser(prog='doors.py')835>>> parser.add_argument('door', type=int, choices=range(1, 4))836>>> print(parser.parse_args(['3']))837Namespace(door=3)838>>> parser.parse_args(['4'])839usage: doors.py [-h] {1,2,3}840doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)841```842843Any object that supports the `in` operator can be passed as the *choices* value, so [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict) objects, [`set`](https://python-all.ru/3.2/library/stdtypes.html#set) objects, custom containers, etc. are all supported.844845### 15.4.3.8. required846847In general, the [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) module assumes that flags like `-f` and `--bar` indicate *optional* arguments, which can always be omitted at the command line. To make an option *required*, `True` can be specified for the `required=` keyword argument to [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument):848849```python850>>> parser = argparse.ArgumentParser()851>>> parser.add_argument('--foo', required=True)852>>> parser.parse_args(['--foo', 'BAR'])853Namespace(foo='BAR')854>>> parser.parse_args([])855usage: argparse.py [-h] [--foo FOO]856argparse.py: error: option --foo is required857```858859Как показывает пример, если опция помечена как `required`, [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) сообщит об ошибке, если эта опция отсутствует в командной строке.860861> **Примечание**862>863> Обязательные опции обычно считаются дурным тоном, поскольку пользователи ожидают, что *опции* будут *необязательными*, поэтому их следует по возможности избегать.864865### 15.4.3.9. help866867Значение `help` – это строка, содержащая краткое описание аргумента. Когда пользователь запрашивает справку (обычно с помощью `-h` или `--help` в командной строке), эти описания `help` будут отображаться для каждого аргумента:868869```python870>>> parser = argparse.ArgumentParser(prog='frobble')871>>> parser.add_argument('--foo', action='store_true',872... help='foo the bars before frobbling')873>>> parser.add_argument('bar', nargs='+',874... help='one of the bars to be frobbled')875>>> parser.parse_args('-h'.split())876usage: frobble [-h] [--foo] bar [bar ...]877878positional arguments:879 bar one of the bars to be frobbled880881optional arguments:882 -h, --help show this help message and exit883 --foo foo the bars before frobbling884```885886Строки `help` могут содержать различные спецификаторы формата, чтобы избежать повторения таких вещей, как имя программы или значение [default](https://python-all.ru/3.2/library/argparse.html#default). Доступные спецификаторы включают имя программы `%(prog)s` и большинство именованных аргументов функции [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), например `%(default)s`, `%(type)s` и т. д.:887888```python889>>> parser = argparse.ArgumentParser(prog='frobble')890>>> parser.add_argument('bar', nargs='?', type=int, default=42,891... help='the bar to %(prog)s (default: %(default)s)')892>>> parser.print_help()893usage: frobble [-h] [bar]894895positional arguments:896 bar the bar to frobble (default: 42)897898optional arguments:899 -h, --help show this help message and exit900```901902Поскольку строка справки поддерживает %-форматирование, если требуется, чтобы в ней отображался литерал `%`, его нужно экранировать как `%%`.903904[`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) поддерживает скрытие записи справки для определённых опций путём установки значения `help` в `argparse.SUPPRESS`:905906```python907>>> parser = argparse.ArgumentParser(prog='frobble')908>>> parser.add_argument('--foo', help=argparse.SUPPRESS)909>>> parser.print_help()910usage: frobble [-h]911912optional arguments:913 -h, --help show this help message and exit914```915916### 15.4.3.10. metavar917918Когда [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) генерирует сообщения справки, ему нужен способ ссылаться на каждый ожидаемый аргумент. По умолчанию объекты ArgumentParser используют значение [dest](https://python-all.ru/3.2/library/argparse.html#dest) в качестве «имени» каждого объекта. По умолчанию для действий позиционных аргументов значение [dest](https://python-all.ru/3.2/library/argparse.html#dest) используется непосредственно, а для действий необязательных аргументов значение [dest](https://python-all.ru/3.2/library/argparse.html#dest) приводится к верхнему регистру. Таким образом, одиночный позиционный аргумент с `dest='bar'` будет называться `bar`. Одиночный необязательный аргумент `--foo`, за которым должен следовать один аргумент командной строки, будет называться `FOO`. Пример:919920```python921>>> parser = argparse.ArgumentParser()922>>> parser.add_argument('--foo')923>>> parser.add_argument('bar')924>>> parser.parse_args('X --foo Y'.split())925Namespace(bar='X', foo='Y')926>>> parser.print_help()927usage: [-h] [--foo FOO] bar928929positional arguments:930 bar931932optional arguments:933 -h, --help show this help message and exit934 --foo FOO935```936937Альтернативное имя можно указать с помощью `metavar`:938939```python940>>> parser = argparse.ArgumentParser()941>>> parser.add_argument('--foo', metavar='YYY')942>>> parser.add_argument('bar', metavar='XXX')943>>> parser.parse_args('X --foo Y'.split())944Namespace(bar='X', foo='Y')945>>> parser.print_help()946usage: [-h] [--foo YYY] XXX947948positional arguments:949 XXX950951optional arguments:952 -h, --help show this help message and exit953 --foo YYY954```955956Обратите внимание, что `metavar` изменяет только *отображаемое* имя – имя атрибута в объекте, возвращаемом [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), по-прежнему определяется значением [dest](https://python-all.ru/3.2/library/argparse.html#dest).957958Различные значения `nargs` могут привести к многократному использованию metavar. Передача кортежа в `metavar` задаёт различное отображение для каждого из аргументов:959960```python961>>> parser = argparse.ArgumentParser(prog='PROG')962>>> parser.add_argument('-x', nargs=2)963>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))964>>> parser.print_help()965usage: PROG [-h] [-x X X] [--foo bar baz]966967optional arguments:968 -h, --help show this help message and exit969 -x X X970 --foo bar baz971```972973### 15.4.3.11. dest974975Most [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) actions add some value as an attribute of the object returned by [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). The name of this attribute is determined by the `dest` keyword argument of [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument). For positional argument actions, `dest` is normally supplied as the first argument to [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument):976977```python978>>> parser = argparse.ArgumentParser()979>>> parser.add_argument('bar')980>>> parser.parse_args('XXX'.split())981Namespace(bar='XXX')982```983984Для действий необязательных аргументов значение `dest` обычно выводится из строк опций. [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) генерирует значение `dest` путём взятия первой длинной строки опции и удаления начальной строки `--`. Если длинные строки опций не были указаны, `dest` будет получен из первой короткой строки опции путём удаления начального символа `-`. Любые внутренние символы `-` будут преобразованы в символы `_`, чтобы строка была допустимым именем атрибута. Примеры ниже иллюстрируют это поведение:985986```python987>>> parser = argparse.ArgumentParser()988>>> parser.add_argument('-f', '--foo-bar', '--foo')989>>> parser.add_argument('-x', '-y')990>>> parser.parse_args('-f 1 -x 2'.split())991Namespace(foo_bar='1', x='2')992>>> parser.parse_args('--foo 1 -y 2'.split())993Namespace(foo_bar='1', x='2')994```995996`dest` позволяет указать пользовательское имя атрибута:997998```python999>>> parser = argparse.ArgumentParser()1000>>> parser.add_argument('--foo', dest='bar')1001>>> parser.parse_args('--foo XXX'.split())1002Namespace(bar='XXX')1003```10041005### 15.4.3.12. Классы Action10061007Классы Action реализуют API Action, вызываемый объект, который возвращает вызываемый объект, обрабатывающий аргументы командной строки. Любой объект, соответствующий этому API, может быть передан как параметр `action` в [:method:\`add\_argument\`](https://python-all.ru/3.2/library/argparse.html#id1).10081009#### `Action(option_strings, dest, nargs=None, const=None, default=None,`10101011#### `type=None, choices=None, required=False, help=None,`10121013#### `metavar=None)`10141015Объекты Action используются ArgumentParser для представления информации, необходимой для разбора одного аргумента из одной или нескольких строк командной строки. Класс Action должен принимать два позиционных аргумента плюс любые именованные аргументы, переданные в [:method:\`ArgumentParser.add\_argument\`](https://python-all.ru/3.2/library/argparse.html#id3), за исключением самого `action`.10161017Экземпляры Action (или возвращаемое значение любого вызываемого объекта для параметра `action`) должны иметь определённые атрибуты “dest”, “option\_strings”, “default”, “type”, “required”, “help” и т. д. Самый простой способ гарантировать, что эти атрибуты определены – вызвать `Action.__init__`.10181019Экземпляры Action должны быть вызываемыми, поэтому подклассы должны переопределять метод `__call__`, который должен принимать четыре параметра:10201021- `parser` – объект ArgumentParser, который содержит это действие.1022- `namespace` – объект [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace), который будет возвращён [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). Большинство действий добавляют атрибут к этому объекту с помощью [`setattr()`](https://python-all.ru/3.2/library/functions.html#setattr).1023- `values` – соответствующие аргументы командной строки, после применения всех преобразований типов. Преобразования типов задаются именованным аргументом [type](https://python-all.ru/3.2/library/argparse.html#type) в [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument).1024- `option_string` – строка опции, которая использовалась для вызова этого действия. Аргумент `option_string` является необязательным и будет отсутствовать, если действие связано с позиционным аргументом.10251026Метод `__call__` может выполнять произвольные действия, но обычно устанавливает атрибуты в `namespace` на основе `dest` и `values`.10271028## 15.4.4. Метод parse\_args()10291030#### `ArgumentParser.parse_args(args=None, namespace=None)`10311032Преобразует строки аргументов в объекты и назначает их в качестве атрибутов пространства имён. Возвращает заполненное пространство имён.10331034Предыдущие вызовы [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) определяют, какие именно объекты создаются и как они назначаются. Подробнее см. документацию к [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument).10351036По умолчанию строки аргументов берутся из [`sys.argv`](https://python-all.ru/3.2/library/sys.html#sys.argv), и создаётся новый пустой объект [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace) для атрибутов.10371038### 15.4.4.1. Синтаксис значений опций10391040Метод [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) поддерживает несколько способов указания значения опции (если она принимает значение). В простейшем случае опция и её значение передаются как два отдельных аргумента:10411042```python1043>>> parser = argparse.ArgumentParser(prog='PROG')1044>>> parser.add_argument('-x')1045>>> parser.add_argument('--foo')1046>>> parser.parse_args('-x X'.split())1047Namespace(foo=None, x='X')1048>>> parser.parse_args('--foo FOO'.split())1049Namespace(foo='FOO', x=None)1050```10511052Для длинных параметров (с именами длиннее одного символа) параметр и значение могут быть переданы как один аргумент командной строки, используя `=` для их разделения:10531054```python1055>>> parser.parse_args('--foo=FOO'.split())1056Namespace(foo='FOO', x=None)1057```10581059Для коротких опций (опции длиной в один символ) опция и её значение могут быть объединены:10601061```python1062>>> parser.parse_args('-xX'.split())1063Namespace(foo=None, x='X')1064```10651066Несколько коротких опций можно объединить, используя только один префикс `-`, при условии, что только последняя опция (или ни одна из них) требует значения:10671068```python1069>>> parser = argparse.ArgumentParser(prog='PROG')1070>>> parser.add_argument('-x', action='store_true')1071>>> parser.add_argument('-y', action='store_true')1072>>> parser.add_argument('-z')1073>>> parser.parse_args('-xyzZ'.split())1074Namespace(x=True, y=True, z='Z')1075```10761077### 15.4.4.2. Недопустимые аргументы10781079При разборе командной строки [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) проверяет на наличие различных ошибок, включая неоднозначные опции, недопустимые типы, неверные опции, неправильное количество позиционных аргументов и т.д. Когда такая ошибка обнаруживается, он завершает работу и выводит сообщение об ошибке вместе с сообщением об использовании:10801081```python1082>>> parser = argparse.ArgumentParser(prog='PROG')1083>>> parser.add_argument('--foo', type=int)1084>>> parser.add_argument('bar', nargs='?')10851086>>> # недопустимый тип1087>>> parser.parse_args(['--foo', 'spam'])1088usage: PROG [-h] [--foo FOO] [bar]1089PROG: error: argument --foo: invalid int value: 'spam'10901091>>> # недопустимая опция1092>>> parser.parse_args(['--bar'])1093usage: PROG [-h] [--foo FOO] [bar]1094PROG: error: no such option: --bar10951096>>> # неверное количество аргументов1097>>> parser.parse_args(['spam', 'badger'])1098usage: PROG [-h] [--foo FOO] [bar]1099PROG: error: extra arguments found: badger1100```11011102### 15.4.4.3. Аргументы, содержащие `-`11031104Метод [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) старается выдавать ошибки всякий раз, когда пользователь явно допустил ошибку, но некоторые ситуации по своей сути неоднозначны. Например, аргумент командной строки `-1` может быть как попыткой указать опцию, так и попыткой передать позиционный аргумент. Метод [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) в этом случае действует осторожно: позиционные аргументы могут начинаться с `-` только если они выглядят как отрицательные числа и в синтаксическом анализаторе нет опций, которые выглядят как отрицательные числа:11051106```python1107>>> parser = argparse.ArgumentParser(prog='PROG')1108>>> parser.add_argument('-x')1109>>> parser.add_argument('foo', nargs='?')11101111>>> # нет опций с отрицательными числами, поэтому -1 – позиционный аргумент1112>>> parser.parse_args(['-x', '-1'])1113Namespace(foo=None, x='-1')11141115>>> # нет опций с отрицательными числами, поэтому -1 и -5 – позиционные аргументы1116>>> parser.parse_args(['-x', '-1', '-5'])1117Namespace(foo='-5', x='-1')11181119>>> parser = argparse.ArgumentParser(prog='PROG')1120>>> parser.add_argument('-1', dest='one')1121>>> parser.add_argument('foo', nargs='?')11221123>>> # опции с отрицательными числами присутствуют, поэтому -1 – это опция1124>>> parser.parse_args(['-1', 'X'])1125Namespace(foo=None, one='X')11261127>>> # опции с отрицательными числами присутствуют, поэтому -2 – это опция1128>>> parser.parse_args(['-2'])1129usage: PROG [-h] [-1 ONE] [foo]1130PROG: error: no such option: -211311132>>> # опции с отрицательными числами присутствуют, поэтому обе -1 – это опции1133>>> parser.parse_args(['-1', '-1'])1134usage: PROG [-h] [-1 ONE] [foo]1135PROG: error: argument -1: expected one argument1136```11371138Если у вас есть позиционные аргументы, которые должны начинаться с `-` и не выглядят как отрицательные числа, можно вставить псевдоаргумент `'--'`, который сообщает [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), что всё после этого является позиционным аргументом:11391140```python1141>>> parser.parse_args(['--', '-f'])1142Namespace(foo='-f', one=None)1143```11441145### 15.4.4.4. Сокращения аргументов11461147Метод [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) позволяет сокращать длинные опции, если сокращение однозначно:11481149```python1150>>> parser = argparse.ArgumentParser(prog='PROG')1151>>> parser.add_argument('-bacon')1152>>> parser.add_argument('-badger')1153>>> parser.parse_args('-bac MMM'.split())1154Namespace(bacon='MMM', badger=None)1155>>> parser.parse_args('-bad WOOD'.split())1156Namespace(bacon=None, badger='WOOD')1157>>> parser.parse_args('-ba BA'.split())1158usage: PROG [-h] [-bacon BACON] [-badger BADGER]1159PROG: error: ambiguous option: -ba could match -badger, -bacon1160```11611162Для аргументов, которые могут соответствовать более чем одной опции, выдаётся ошибка.11631164### 15.4.4.5. Помимо `sys.argv`11651166Sometimes it may be useful to have an ArgumentParser parse arguments other than those of [`sys.argv`](https://python-all.ru/3.2/library/sys.html#sys.argv). This can be accomplished by passing a list of strings to [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args). This is useful for testing at the interactive prompt:11671168```python1169>>> parser = argparse.ArgumentParser()1170>>> parser.add_argument(1171... 'integers', metavar='int', type=int, choices=range(10),1172... nargs='+', help='an integer in the range 0..9')1173>>> parser.add_argument(1174... '--sum', dest='accumulate', action='store_const', const=sum,1175... default=max, help='sum the integers (default: find the max)')1176>>> parser.parse_args(['1', '2', '3', '4'])1177Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])1178>>> parser.parse_args('1 2 3 4 --sum'.split())1179Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])1180```11811182### 15.4.4.6. Объект Namespace11831184#### `class argparse.Namespace`11851186Простой класс, используемый по умолчанию методом [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) для создания объекта, содержащего атрибуты, и его возврата.11871188Этот класс намеренно простой, всего лишь подкласс [`object`](https://python-all.ru/3.2/library/functions.html#object) с читаемым строковым представлением. Если вы предпочитаете словареподобное представление атрибутов, можно использовать стандартный идиоматический приём Python, [`vars()`](https://python-all.ru/3.2/library/functions.html#vars):11891190```python1191>>> parser = argparse.ArgumentParser()1192>>> parser.add_argument('--foo')1193>>> args = parser.parse_args(['--foo', 'BAR'])1194>>> vars(args)1195{'foo': 'BAR'}1196```11971198Также может быть полезно заставить [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) присваивать атрибуты уже существующему объекту, а не новому объекту [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace). Этого можно достичь, указав именованный аргумент `namespace=`:11991200```python1201>>> class C:1202... pass1203...1204>>> c = C()1205>>> parser = argparse.ArgumentParser()1206>>> parser.add_argument('--foo')1207>>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)1208>>> c.foo1209'BAR'1210```12111212## 15.4.5. Другие утилиты12131214### 15.4.5.1. Подкоманды12151216#### `ArgumentParser.add_subparsers()`12171218Многие программы разделяют свою функциональность на ряд подкоманд, например, программа `svn` может вызывать подкоманды, такие как `svn checkout`, `svn update` и `svn commit`. Разделение функциональности таким образом может быть особенно хорошей идеей, когда программа выполняет несколько разных функций, требующих различных типов аргументов командной строки. [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) поддерживает создание таких подкоманд с помощью метода [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers). Метод [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers) обычно вызывается без аргументов и возвращает специальный объект действия. Этот объект имеет единственный метод, `add_parser()`, который принимает имя команды и любые аргументы конструктора [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), и возвращает объект [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser), который можно изменять как обычно.12191220Пример использования:12211222```python1223>>> # создать парсер верхнего уровня1224>>> parser = argparse.ArgumentParser(prog='PROG')1225>>> parser.add_argument('--foo', action='store_true', help='foo help')1226>>> subparsers = parser.add_subparsers(help='sub-command help')1227>>>1228>>> # создать парсер для команды "a"1229>>> parser_a = subparsers.add_parser('a', help='a help')1230>>> parser_a.add_argument('bar', type=int, help='bar help')1231>>>1232>>> # создать парсер для команды "b"1233>>> parser_b = subparsers.add_parser('b', help='b help')1234>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')1235>>>1236>>> # разобрать некоторые списки аргументов1237>>> parser.parse_args(['a', '12'])1238Namespace(bar=12, foo=False)1239>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])1240Namespace(baz='Z', foo=True)1241```12421243Обратите внимание, что объект, возвращаемый [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), будет содержать только атрибуты для основного синтаксического анализатора и того подпарсера, который был выбран командной строкой (и никаких других подпарсеров). Так, в приведённом выше примере, когда указана команда `a`, присутствуют только атрибуты `foo` и `bar`, а когда указана команда `b`, присутствуют только атрибуты `foo` и `baz`.12441245Аналогично, когда запрашивается справка от подпарсера, будет выведена только справка для этого конкретного синтаксического анализатора. Сообщение справки не будет включать сообщения родительского или дочерних синтаксических анализаторов. (Однако справку для каждой подкоманды подпарсера можно задать, передав аргумент `help=` в `add_parser()`, как указано выше.)12461247```python1248>>> parser.parse_args(['--help'])1249usage: PROG [-h] [--foo] {a,b} ...12501251positional arguments:1252 {a,b} sub-command help1253 a a help1254 b b help12551256optional arguments:1257 -h, --help show this help message and exit1258 --foo foo help12591260>>> parser.parse_args(['a', '--help'])1261usage: PROG a [-h] bar12621263positional arguments:1264 bar bar help12651266optional arguments:1267 -h, --help show this help message and exit12681269>>> parser.parse_args(['b', '--help'])1270usage: PROG b [-h] [--baz {X,Y,Z}]12711272optional arguments:1273 -h, --help show this help message and exit1274 --baz {X,Y,Z} baz help1275```12761277Метод [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers) также поддерживает именованные аргументы `title` и `description`. Когда любой из них присутствует, команды подпарсера будут отображаться в собственной группе в выводе справки. Например:12781279```python1280>>> parser = argparse.ArgumentParser()1281>>> subparsers = parser.add_subparsers(title='subcommands',1282... description='valid subcommands',1283... help='additional help')1284>>> subparsers.add_parser('foo')1285>>> subparsers.add_parser('bar')1286>>> parser.parse_args(['-h'])1287usage: [-h] {foo,bar} ...12881289optional arguments:1290 -h, --help show this help message and exit12911292subcommands:1293 valid subcommands12941295 {foo,bar} additional help1296```12971298Кроме того, `add_parser` поддерживает дополнительный аргумент `aliases`, который позволяет нескольким строкам ссылаться на один и тот же подпарсер. В этом примере, как и в `svn`, псевдоним `co` задаётся как сокращение для `checkout`:12991300```python1301>>> parser = argparse.ArgumentParser()1302>>> subparsers = parser.add_subparsers()1303>>> checkout = subparsers.add_parser('checkout', aliases=['co'])1304>>> checkout.add_argument('foo')1305>>> parser.parse_args(['co', 'bar'])1306Namespace(foo='bar')1307```13081309Один из особенно эффективных способов работы с подкомандами – комбинировать использование метода [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers) с вызовами [`set_defaults()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.set_defaults), чтобы каждый подпарсер знал, какую функцию Python он должен выполнять. Например:13101311```python1312>>> # функции подкоманд1313>>> def foo(args):1314... print(args.x * args.y)1315...1316>>> def bar(args):1317... print('((%s))' % args.z)1318...1319>>> # создать парсер верхнего уровня1320>>> parser = argparse.ArgumentParser()1321>>> subparsers = parser.add_subparsers()1322>>>1323>>> # создать парсер для команды "foo"1324>>> parser_foo = subparsers.add_parser('foo')1325>>> parser_foo.add_argument('-x', type=int, default=1)1326>>> parser_foo.add_argument('y', type=float)1327>>> parser_foo.set_defaults(func=foo)1328>>>1329>>> # создать парсер для команды "bar"1330>>> parser_bar = subparsers.add_parser('bar')1331>>> parser_bar.add_argument('z')1332>>> parser_bar.set_defaults(func=bar)1333>>>1334>>> # разобрать аргументы и вызвать выбранную функцию1335>>> args = parser.parse_args('foo 1 -x 2'.split())1336>>> args.func(args)13372.01338>>>1339>>> # разобрать аргументы и вызвать выбранную функцию1340>>> args = parser.parse_args('bar XYZYX'.split())1341>>> args.func(args)1342((XYZYX))1343```13441345Таким образом, можно позволить [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) выполнить вызов соответствующей функции после завершения разбора аргументов. Связывание функций с действиями таким образом – это, как правило, самый простой способ обрабатывать разные действия для каждого из ваших подпарсеров. Однако, если необходимо проверить имя вызванного подпарсера, именованный аргумент `dest` вызова [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers) сработает:13461347```python1348>>> parser = argparse.ArgumentParser()1349>>> subparsers = parser.add_subparsers(dest='subparser_name')1350>>> subparser1 = subparsers.add_parser('1')1351>>> subparser1.add_argument('-x')1352>>> subparser2 = subparsers.add_parser('2')1353>>> subparser2.add_argument('y')1354>>> parser.parse_args(['2', 'frobble'])1355Namespace(subparser_name='2', y='frobble')1356```13571358### 15.4.5.2. Объекты FileType13591360#### `class argparse.FileType(mode='r', bufsize=None)`13611362Фабрика [`FileType`](https://python-all.ru/3.2/library/argparse.html#argparse.FileType) создаёт объекты, которые можно передать в аргумент type функции [`ArgumentParser.add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument). Аргументы, у которых в качестве типа указаны объекты [`FileType`](https://python-all.ru/3.2/library/argparse.html#argparse.FileType), будут открывать переданные в командной строке имена файлов как файлы с указанными режимами и размерами буфера:13631364```python1365>>> parser = argparse.ArgumentParser()1366>>> parser.add_argument('--output', type=argparse.FileType('wb', 0))1367>>> parser.parse_args(['--output', 'out'])1368Namespace(output=<_io.BufferedWriter name='out'>)1369```13701371Объекты FileType распознают псевдоаргумент `'-'` и автоматически преобразуют его в `sys.stdin` для читаемых объектов [`FileType`](https://python-all.ru/3.2/library/argparse.html#argparse.FileType) и в `sys.stdout` для записываемых объектов [`FileType`](https://python-all.ru/3.2/library/argparse.html#argparse.FileType).13721373```python1374>>> parser = argparse.ArgumentParser()1375>>> parser.add_argument('infile', type=argparse.FileType('r'))1376>>> parser.parse_args(['-'])1377Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)1378```13791380### 15.4.5.3. Группы аргументов13811382#### `ArgumentParser.add_argument_group(title=None, description=None)`13831384По умолчанию [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) группирует аргументы командной строки на «позиционные аргументы» и «опциональные аргументы» при выводе справочных сообщений. Если есть более удачная логическая группировка, чем эта стандартная, можно создать подходящие группы с помощью метода [`add_argument_group()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument_group).13851386```python1387>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)1388>>> group = parser.add_argument_group('group')1389>>> group.add_argument('--foo', help='foo help')1390>>> group.add_argument('bar', help='bar help')1391>>> parser.print_help()1392usage: PROG [--foo FOO] bar13931394group:1395 bar bar help1396 --foo FOO foo help1397```13981399Метод [`add_argument_group()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument_group) возвращает объект группы аргументов, у которого есть метод [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), как у обычного [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Когда аргумент добавляется в группу, синтаксический анализатор обрабатывает его как обычный аргумент, но при выводе справки показывает его в отдельной группе. Метод [`add_argument_group()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument_group) принимает аргументы *title* и *description*, с помощью которых можно настроить отображение.14001401```python1402>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)1403>>> group1 = parser.add_argument_group('group1', 'group1 description')1404>>> group1.add_argument('foo', help='foo help')1405>>> group2 = parser.add_argument_group('group2', 'group2 description')1406>>> group2.add_argument('--bar', help='bar help')1407>>> parser.print_help()1408usage: PROG [--bar BAR] foo14091410group1:1411 group1 description14121413 foo foo help14141415group2:1416 group2 description14171418 --bar BAR bar help1419```14201421Обратите внимание, что любые аргументы, не входящие в ваши пользовательские группы, окажутся обратно в обычных разделах «позиционные аргументы» и «опциональные аргументы».14221423### 15.4.5.4. Взаимное исключение14241425#### `argparse.add_mutually_exclusive_group(required=False)`14261427Создаёт взаимоисключающую группу. [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) гарантирует, что в командной строке будет присутствовать только один из аргументов взаимоисключающей группы.14281429```python1430>>> parser = argparse.ArgumentParser(prog='PROG')1431>>> group = parser.add_mutually_exclusive_group()1432>>> group.add_argument('--foo', action='store_true')1433>>> group.add_argument('--bar', action='store_false')1434>>> parser.parse_args(['--foo'])1435Namespace(bar=True, foo=True)1436>>> parser.parse_args(['--bar'])1437Namespace(bar=False, foo=False)1438>>> parser.parse_args(['--foo', '--bar'])1439usage: PROG [-h] [--foo | --bar]1440PROG: error: argument --bar: not allowed with argument --foo1441```14421443Метод [`add_mutually_exclusive_group()`](https://python-all.ru/3.2/library/argparse.html#argparse.add_mutually_exclusive_group) также принимает аргумент *required*, который указывает, что хотя бы один из взаимоисключающих аргументов обязателен.14441445```python1446>>> parser = argparse.ArgumentParser(prog='PROG')1447>>> group = parser.add_mutually_exclusive_group(required=True)1448>>> group.add_argument('--foo', action='store_true')1449>>> group.add_argument('--bar', action='store_false')1450>>> parser.parse_args([])1451usage: PROG [-h] (--foo | --bar)1452PROG: error: one of the arguments --foo --bar is required1453```14541455Обратите внимание, что взаимоисключающие группы аргументов в настоящее время не поддерживают аргументы *title* и *description* из метода [`add_argument_group()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument_group).14561457### 15.4.5.5. Значения по умолчанию парсера14581459#### `ArgumentParser.set_defaults(**kwargs)`14601461В большинстве случаев атрибуты объекта, возвращаемого [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), полностью определяются анализом аргументов командной строки и действий над аргументами. [`set_defaults()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.set_defaults) позволяет добавить дополнительные атрибуты, которые определяются без анализа командной строки.14621463```python1464>>> parser = argparse.ArgumentParser()1465>>> parser.add_argument('foo', type=int)1466>>> parser.set_defaults(bar=42, baz='badger')1467>>> parser.parse_args(['736'])1468Namespace(bar=42, baz='badger', foo=736)1469```14701471Обратите внимание: значения по умолчанию на уровне анализатора всегда переопределяют значения по умолчанию на уровне аргументов:14721473```python1474>>> parser = argparse.ArgumentParser()1475>>> parser.add_argument('--foo', default='bar')1476>>> parser.set_defaults(foo='spam')1477>>> parser.parse_args([])1478Namespace(foo='spam')1479```14801481Значения по умолчанию на уровне синтаксического анализатора особенно полезны при работе с несколькими анализаторами. Пример такого использования см. в методе [`add_subparsers()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_subparsers).14821483#### `ArgumentParser.get_default(dest)`14841485Возвращает значение по умолчанию для атрибута пространства имён, заданное либо методом [`add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument), либо методом [`set_defaults()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.set_defaults).14861487```python1488>>> parser = argparse.ArgumentParser()1489>>> parser.add_argument('--foo', default='badger')1490>>> parser.get_default('foo')1491'badger'1492```14931494### 15.4.5.6. Вывод справки14951496В большинстве типичных приложений [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args) берёт на себя форматирование и вывод сообщений об использовании и ошибках. Однако доступно несколько методов форматирования:14971498#### `ArgumentParser.print_usage(file=None)`14991500Выводит краткое описание того, как [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) должен вызываться в командной строке. Если *file* равно `None`, подразумевается [`sys.stdout`](https://python-all.ru/3.2/library/sys.html#sys.stdout).15011502#### `ArgumentParser.print_help(file=None)`15031504Выводит справочное сообщение, включая использование программы и информацию об аргументах, зарегистрированных в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser). Если *file* равно `None`, подразумевается [`sys.stdout`](https://python-all.ru/3.2/library/sys.html#sys.stdout).15051506Существуют также варианты этих методов, которые просто возвращают строку вместо её вывода:15071508#### `ArgumentParser.format_usage()`15091510Возвращает строку, содержащую краткое описание того, как [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser) должен вызываться в командной строке.15111512#### `ArgumentParser.format_help()`15131514Возвращает строку, содержащую справочное сообщение, включая использование программы и информацию об аргументах, зарегистрированных в [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser).15151516### 15.4.5.7. Частичный разбор15171518#### `ArgumentParser.parse_known_args(args=None, namespace=None)`15191520Иногда скрипту нужно разобрать лишь часть аргументов командной строки, передавая оставшиеся другому скрипту или программе. В таких случаях может быть полезен метод [`parse_known_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_known_args). Он работает аналогично [`parse_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.parse_args), но не вызывает ошибку при наличии лишних аргументов. Вместо этого он возвращает кортеж из двух элементов: заполненное пространство имён и список оставшихся строк аргументов.15211522```python1523>>> parser = argparse.ArgumentParser()1524>>> parser.add_argument('--foo', action='store_true')1525>>> parser.add_argument('bar')1526>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])1527(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])1528```15291530### 15.4.5.8. Настройка разбора файлов15311532#### `ArgumentParser.convert_arg_line_to_args(arg_line)`15331534Аргументы, которые считываются из файла (см. именованный аргумент *fromfile\_prefix\_chars* конструктора [`ArgumentParser`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser)), считываются по одному аргументу на строку. Метод [`convert_arg_line_to_args()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args) можно переопределить для более сложного чтения.15351536Этот метод принимает один аргумент *arg\_line* – строку, прочитанную из файла аргументов. Он возвращает список аргументов, разобранных из этой строки. Метод вызывается по одному разу для каждой строки из файла аргументов, по порядку.15371538Полезный вариант переопределения этого метода – такой, который воспринимает каждое слово, разделённое пробелом, как отдельный аргумент.15391540```python1541def convert_arg_line_to_args(self, arg_line):1542 for arg in arg_line.split():1543 if not arg.strip():1544 continue1545 yield arg1546```15471548### 15.4.5.9. Методы выхода15491550#### `ArgumentParser.exit(status=0, message=None)`15511552Этот метод завершает программу, выходя с указанным *статус* и, если задан, выводит *сообщение* перед этим.15531554#### `ArgumentParser.error(message)`15551556Этот метод выводит сообщение об использовании, включая *message*, в стандартный поток ошибок и завершает программу с кодом возврата 2.15571558## 15.4.6. Обновление кода optparse15591560Originally, the [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) module had attempted to maintain compatibility with [`optparse`](https://python-all.ru/3.2/library/optparse.html#module-optparse). However, [`optparse`](https://python-all.ru/3.2/library/optparse.html#module-optparse) was difficult to extend transparently, particularly with the changes required to support the new `nargs=` specifiers and better usage messages. When most everything in [`optparse`](https://python-all.ru/3.2/library/optparse.html#module-optparse) had either been copy-pasted over or monkey-patched, it no longer seemed practical to try to maintain the backwards compatibility.15611562Частичный путь обновления с [`optparse`](https://python-all.ru/3.2/library/optparse.html#module-optparse) на [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse):15631564- Замените все вызовы [`optparse.OptionParser.add_option()`](https://python-all.ru/3.2/library/optparse.html#optparse.OptionParser.add_option) на вызовы [`ArgumentParser.add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument).1565- Замените `(options, args) = parser.parse_args()` на `args = parser.parse_args()` и добавьте дополнительные вызовы [`ArgumentParser.add_argument()`](https://python-all.ru/3.2/library/argparse.html#argparse.ArgumentParser.add_argument) для позиционных аргументов. Учтите, что то, что ранее называлось `options`, теперь в контексте [`argparse`](https://python-all.ru/3.2/library/argparse.html#module-argparse) называется `args`.1566- Замените колбэк-действия и именованные аргументы `callback_*` на аргументы `type` или `action`.1567- Замените строковые имена для именованных аргументов `type` соответствующими объектами типов (например, int, float, complex и т.д.).1568- Замените `optparse.Values` на [`Namespace`](https://python-all.ru/3.2/library/argparse.html#argparse.Namespace), а `optparse.OptionError` и `optparse.OptionValueError` на `ArgumentError`.1569- Замените строки с неявными аргументами, такими как `%default` или `%prog`, на стандартный синтаксис Python с использованием словарей для форматирования строк, а именно `%(default)s` и `%(prog)s`.1570- Замените аргумент `version` конструктора OptionParser на вызов `parser.add_argument('--version', action='version', version='<the version>')`1571