argparse.md
1> **Источник:** https://python-all.ru/3.12/library/argparse.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `argparse` – парсер для параметров командной строки, аргументов и подкоманд89Добавлено в версии 3.2.1011**Исходный код:** [Lib/argparse.py](https://python-all.ru/src/3.12/Lib/argparse.py)1213---1415Учебное пособие1617На этой странице содержится справочная информация по API. Для более плавного введения в разбор командной строки Python обратитесь к [учебному пособию по argparse](https://python-all.ru/3.12/howto/argparse.html#argparse-tutorial).1819Модуль `argparse` упрощает создание удобных интерфейсов командной строки. Программа определяет, какие аргументы ей требуются, а `argparse` разбирается, как извлечь их из [`sys.argv`](https://python-all.ru/3.12/library/sys.html#sys.argv). Модуль `argparse` также автоматически генерирует сообщения справки и использования. Модуль также выводит ошибки, когда пользователи передают программе недопустимые аргументы.2021Поддержка интерфейсов командной строки модуля `argparse` построена вокруг экземпляра [`argparse.ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Он является контейнером для спецификаций аргументов и имеет параметры, которые применяются к парсеру в целом:2223```python24parser = argparse.ArgumentParser(25 prog='ProgramName',26 description='What the program does',27 epilog='Text at the bottom of help')28```2930Метод [`ArgumentParser.add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) добавляет в парсер отдельные спецификации аргументов. Он поддерживает позиционные аргументы, опции, принимающие значения, и флаги вкл/выкл:3132```python33parser.add_argument('filename') # позиционный аргумент34parser.add_argument('-c', '--count') # опция, которая принимает значение35parser.add_argument('-v', '--verbose',36 action='store_true') # флаг вкл/выкл37```3839Метод [`ArgumentParser.parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) запускает парсер и помещает извлечённые данные в объект [`argparse.Namespace`](https://python-all.ru/3.12/library/argparse.html#argparse.Namespace):4041```python42args = parser.parse_args()43print(args.filename, args.count, args.verbose)44```4546> **Примечание**47>48> Если вы ищете руководство по обновлению кода с [`optparse`](https://python-all.ru/3.12/library/optparse.html#module-optparse) на `argparse`, смотрите [Обновление кода Optparse](https://python-all.ru/3.12/howto/argparse-optparse.html#upgrading-optparse-code).4950## Объекты ArgumentParser5152#### `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, allow_abbrev=True, exit_on_error=True)`5354Создаёт новый объект [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Все параметры должны передаваться как именованные аргументы. Каждый параметр имеет собственное подробное описание ниже, но вкратце они таковы:5556- [prog](https://python-all.ru/3.12/library/argparse.html#prog) – имя программы (по умолчанию: `os.path.basename(sys.argv[0])`)57- [usage](https://python-all.ru/3.12/library/argparse.html#usage) - строка, описывающая использование программы (по умолчанию генерируется из аргументов, добавленных в парсер)58- [description](https://python-all.ru/3.12/library/argparse.html#description) - текст, отображаемый перед справкой по аргументам (по умолчанию отсутствует)59- [epilog](https://python-all.ru/3.12/library/argparse.html#epilog) - текст, отображаемый после справки по аргументам (по умолчанию отсутствует)60- [parents](https://python-all.ru/3.12/library/argparse.html#parents) - список объектов [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser), аргументы которых также должны быть включены61- [formatter\_class](https://python-all.ru/3.12/library/argparse.html#formatter-class) - класс для настройки вывода справки62- [prefix\_chars](https://python-all.ru/3.12/library/argparse.html#prefix-chars) - набор символов, которые являются префиксом необязательных аргументов (по умолчанию: ‘-‘)63- [fromfile\_prefix\_chars](https://python-all.ru/3.12/library/argparse.html#fromfile-prefix-chars) - набор символов, которые являются префиксом файлов, из которых должны читаться дополнительные аргументы (по умолчанию: `None`)64- [argument\_default](https://python-all.ru/3.12/library/argparse.html#argument-default) - глобальное значение по умолчанию для аргументов (по умолчанию: `None`)65- [conflict\_handler](https://python-all.ru/3.12/library/argparse.html#conflict-handler) - стратегия разрешения конфликтов необязательных аргументов (обычно не требуется)66- [add\_help](https://python-all.ru/3.12/library/argparse.html#add-help) - добавить опцию `-h/--help` в парсер (по умолчанию: `True`)67- [allow\_abbrev](https://python-all.ru/3.12/library/argparse.html#allow-abbrev) – позволяет сокращать длинные параметры, если сокращение однозначно. (по умолчанию: `True`)68- [exit\_on\_error](https://python-all.ru/3.12/library/argparse.html#exit-on-error) - определяет, завершает ли `ArgumentParser` работу с сообщением об ошибке при возникновении ошибки (по умолчанию: `True`)6970Изменено в версии 3.5: *allow\_abbrev* – добавлен параметр.7172Изменено в версии 3.8: В предыдущих версиях *allow\_abbrev* также отключал группировку коротких флагов, например `-vv` для обозначения `-v -v`.7374Изменено в версии 3.9: *exit\_on\_error* – добавлен параметр.7576В следующих разделах описывается, как используется каждый из этих параметров.7778### prog7980По умолчанию [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) вычисляет имя программы для отображения в справочных сообщениях в зависимости от того, как был запущен интерпретатор Python:8182- Имя [`base name`](https://python-all.ru/3.12/library/os.path.html#os.path.basename) `sys.argv[0]`, если в качестве аргумента был передан файл.83- Имя интерпретатора Python, за которым следует `sys.argv[0]`, если в качестве аргумента была передана директория или zip-файл.84- Имя интерпретатора Python, за которым следует `-m`, а затем имя модуля или пакета, если была использована опция [`-m`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-m).8586Это поведение по умолчанию почти всегда желательно, поскольку оно делает сообщения справки соответствующими строке, которая использовалась для запуска программы в командной строке. Однако чтобы изменить это поведение, можно указать другое значение с помощью аргумента `prog=` для [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):8788```python89>>> parser = argparse.ArgumentParser(prog='myprogram')90>>> parser.print_help()91usage: myprogram [-h]9293options:94 -h, --help show this help message and exit95```9697Обратите внимание, что имя программы, будь оно определено из `sys.argv[0]` или из аргумента `prog=`, доступно в справочных сообщениях через форматный спецификатор `%(prog)s`.9899```python100>>> parser = argparse.ArgumentParser(prog='myprogram')101>>> parser.add_argument('--foo', help='foo of the %(prog)s program')102>>> parser.print_help()103usage: myprogram [-h] [--foo FOO]104105options:106 -h, --help show this help message and exit107 --foo FOO foo of the myprogram program108```109110### использование111112По умолчанию [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) формирует сообщение об использовании из своих аргументов. Стандартное сообщение можно переопределить с помощью именованного аргумента `usage=`:113114```python115>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')116>>> parser.add_argument('--foo', nargs='?', help='foo help')117>>> parser.add_argument('bar', nargs='+', help='bar help')118>>> parser.print_help()119usage: PROG [options]120121positional arguments:122 bar bar help123124options:125 -h, --help show this help message and exit126 --foo [FOO] foo help127```128129Спецификатор формата `%(prog)s` используется для подстановки имени программы в сообщения об использовании.130131### описание132133Большинство вызовов конструктора [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) используют именованный аргумент `description=`. Этот аргумент задаёт краткое описание того, что делает программа и как она работает. В сообщениях справки описание отображается между строкой использования командной строки и справкой по различным аргументам.134135По умолчанию описание переносится по строкам, чтобы уместиться в отведённом пространстве. Чтобы изменить это поведение, обратитесь к аргументу [formatter\_class](https://python-all.ru/3.12/library/argparse.html#formatter-class).136137### эпилог138139Некоторые программы выводят дополнительное описание после описания аргументов. Такой текст можно указать с помощью аргумента `epilog=` для [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):140141```python142>>> parser = argparse.ArgumentParser(143... description='A foo that bars',144... epilog="And that's how you'd foo a bar")145>>> parser.print_help()146usage: argparse.py [-h]147148A foo that bars149150options:151 -h, --help show this help message and exit152153And that's how you'd foo a bar154```155156Как и для аргумента [description](https://python-all.ru/3.12/library/argparse.html#description), текст `epilog=` по умолчанию переносится по строкам, но это поведение можно настроить с помощью аргумента [formatter\_class](https://python-all.ru/3.12/library/argparse.html#formatter-class) для [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser).157158### родительские парсеры159160Иногда несколько парсеров используют общий набор аргументов. Вместо того чтобы повторять определения этих аргументов, можно использовать один парсер со всеми общими аргументами, передав его в аргумент `parents=` для [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Аргумент `parents=` принимает список объектов [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser), собирает из них все позиционные и опциональные действия и добавляет эти действия в создаваемый объект [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):161162```python163>>> parent_parser = argparse.ArgumentParser(add_help=False)164>>> parent_parser.add_argument('--parent', type=int)165166>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])167>>> foo_parser.add_argument('foo')168>>> foo_parser.parse_args(['--parent', '2', 'XXX'])169Namespace(foo='XXX', parent=2)170171>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])172>>> bar_parser.add_argument('--bar')173>>> bar_parser.parse_args(['--bar', 'YYY'])174Namespace(bar='YYY', parent=None)175```176177Обратите внимание, что большинство родительских парсеров указывают `add_help=False`. В противном случае [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) увидит две опции `-h/--help` (одну в родительском парсере, другую – в дочернем) и вызовет ошибку.178179> **Примечание**180>181> Парсеры должны быть полностью инициализированы перед передачей через `parents=`. Если изменить родительские парсеры после создания дочернего, эти изменения не отразятся на дочернем парсере.182183### класс форматирования184185Объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) позволяют настраивать форматирование справки, указывая альтернативный класс форматирования. На данный момент существует четыре таких класса:186187#### `class argparse.RawDescriptionHelpFormatter`188189#### `class argparse.RawTextHelpFormatter`190191#### `class argparse.ArgumentDefaultsHelpFormatter`192193#### `class argparse.MetavarTypeHelpFormatter`194195[`RawDescriptionHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.RawDescriptionHelpFormatter) и [`RawTextHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.RawTextHelpFormatter) дают больше контроля над отображением текстовых описаний. По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) переносят текст [description](https://python-all.ru/3.12/library/argparse.html#description) и [epilog](https://python-all.ru/3.12/library/argparse.html#epilog) в сообщениях справки командной строки:196197```python198>>> parser = argparse.ArgumentParser(199... prog='PROG',200... description='''this description201... was indented weird202... but that is okay''',203... epilog='''204... likewise for this epilog whose whitespace will205... be cleaned up and whose words will be wrapped206... across a couple lines''')207>>> parser.print_help()208usage: PROG [-h]209210this description was indented weird but that is okay211212options:213 -h, --help show this help message and exit214215likewise for this epilog whose whitespace will be cleaned up and whose words216will be wrapped across a couple lines217```218219Передача [`RawDescriptionHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.RawDescriptionHelpFormatter) в качестве `formatter_class=` означает, что [description](https://python-all.ru/3.12/library/argparse.html#description) и [epilog](https://python-all.ru/3.12/library/argparse.html#epilog) уже правильно отформатированы и не должны переноситься по строкам:220221```python222>>> parser = argparse.ArgumentParser(223... prog='PROG',224... formatter_class=argparse.RawDescriptionHelpFormatter,225... description=textwrap.dedent('''\226... Please do not mess up this text!227... --------------------------------228... I have indented it229... exactly the way230... I want it231... '''))232>>> parser.print_help()233usage: PROG [-h]234235Please do not mess up this text!236--------------------------------237 I have indented it238 exactly the way239 I want it240241options:242 -h, --help show this help message and exit243```244245[`RawTextHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.RawTextHelpFormatter) сохраняет пробельные символы для всех видов текста справки, включая описания аргументов. Однако несколько символов новой строки заменяются на один. Если нужно сохранить несколько пустых строк, добавьте пробелы между ними.246247[`ArgumentDefaultsHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter) автоматически добавляет информацию о значениях по умолчанию в сообщения справки каждого аргумента:248249```python250>>> parser = argparse.ArgumentParser(251... prog='PROG',252... formatter_class=argparse.ArgumentDefaultsHelpFormatter)253>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')254>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')255>>> parser.print_help()256usage: PROG [-h] [--foo FOO] [bar ...]257258positional arguments:259 bar BAR! (default: [1, 2, 3])260261options:262 -h, --help show this help message and exit263 --foo FOO FOO! (default: 42)264```265266[`MetavarTypeHelpFormatter`](https://python-all.ru/3.12/library/argparse.html#argparse.MetavarTypeHelpFormatter) использует имя аргумента [type](https://python-all.ru/3.12/library/argparse.html#type) для каждого аргумента в качестве отображаемого имени для его значений (вместо [dest](https://python-all.ru/3.12/library/argparse.html#dest), как это делает обычный форматировщик):267268```python269>>> parser = argparse.ArgumentParser(270... prog='PROG',271... formatter_class=argparse.MetavarTypeHelpFormatter)272>>> parser.add_argument('--foo', type=int)273>>> parser.add_argument('bar', type=float)274>>> parser.print_help()275usage: PROG [-h] [--foo int] float276277positional arguments:278 float279280options:281 -h, --help show this help message and exit282 --foo int283```284285### символы префикса286287Большинство опций командной строки используют `-` в качестве префикса, например `-f/--foo`. Парсеры, которым нужно поддерживать другие или дополнительные символы префикса, например для опций вроде `+f` или `/foo`, могут указать их с помощью аргумента `prefix_chars=` конструктора [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):288289```python290>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')291>>> parser.add_argument('+f')292>>> parser.add_argument('++bar')293>>> parser.parse_args('+f X ++bar Y'.split())294Namespace(bar='Y', f='X')295```296297Аргумент `prefix_chars=` по умолчанию равен `'-'`. Если указать набор символов, не включающий `-`, то опции `-f/--foo` будут запрещены.298299### символы префикса из файла300301Иногда при работе с особенно длинным списком аргументов может иметь смысл хранить список аргументов в файле, а не набирать его в командной строке. Если аргумент `fromfile_prefix_chars=` передан конструктору [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser), то аргументы, начинающиеся с любого из указанных символов, будут рассматриваться как файлы и заменяться на содержащиеся в них аргументы. Например:302303```python304>>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:305... fp.write('-f\nbar')306...307>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')308>>> parser.add_argument('-f')309>>> parser.parse_args(['-f', 'foo', '@args.txt'])310Namespace(f='bar')311```312313Аргументы, читаемые из файла, по умолчанию должны быть по одному на строку (но см. также [`convert_arg_line_to_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args)) и обрабатываются так, как если бы они находились на том же месте, что и исходный файл, ссылающийся на аргумент в командной строке. Таким образом, в приведённом примере выражение `['-f', 'foo', '@args.txt']` считается эквивалентным выражению `['-f', 'foo', '-f', 'bar']`.314315[`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) использует [кодировку и обработчик ошибок файловой системы](https://python-all.ru/3.12/glossary.html#term-filesystem-encoding-and-error-handler) для чтения файла, содержащего аргументы.316317Аргумент `fromfile_prefix_chars=` по умолчанию равен `None`, что означает, что аргументы никогда не будут рассматриваться как ссылки на файлы.318319Изменено в версии 3.12: [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) изменил кодировку и обработку ошибок при чтении файлов аргументов с используемых по умолчанию (например, [`locale.getpreferredencoding(False)`](https://python-all.ru/3.12/library/locale.html#locale.getpreferredencoding) и `"strict"`) на [кодировку и обработчик ошибок файловой системы](https://python-all.ru/3.12/glossary.html#term-filesystem-encoding-and-error-handler). Файлы аргументов должны быть закодированы в UTF-8 вместо кодовой страницы ANSI в Windows.320321### argument\_default322323Обычно значения аргументов по умолчанию задаются либо передачей значения по умолчанию в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), либо вызовом методов [`set_defaults()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.set_defaults) с определённым набором пар имя-значение. Однако иногда может быть полезно указать единое значение по умолчанию для всех аргументов синтаксического анализатора. Это можно сделать, передав именованный аргумент `argument_default=` в [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Например, чтобы глобально отключить создание атрибутов при вызовах [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args), укажите `argument_default=SUPPRESS`:324325```python326>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)327>>> parser.add_argument('--foo')328>>> parser.add_argument('bar', nargs='?')329>>> parser.parse_args(['--foo', '1', 'BAR'])330Namespace(bar='BAR', foo='1')331>>> parser.parse_args([])332Namespace()333```334335### allow\_abbrev336337Обычно при передаче списка аргументов методу [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) объекта [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) он [распознаёт сокращения](https://python-all.ru/3.12/library/argparse.html#prefix-matching) длинных опций.338339Эту возможность можно отключить, установив `allow_abbrev` в `False`:340341```python342>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)343>>> parser.add_argument('--foobar', action='store_true')344>>> parser.add_argument('--foonley', action='store_false')345>>> parser.parse_args(['--foon'])346usage: PROG [-h] [--foobar] [--foonley]347PROG: error: unrecognized arguments: --foon348```349350Добавлено в версии 3.5.351352### conflict\_handler353354Объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) не допускают два действия с одной и той же строкой опции. По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) вызывают исключение при попытке создать аргумент со строкой опции, которая уже используется:355356```python357>>> parser = argparse.ArgumentParser(prog='PROG')358>>> parser.add_argument('-f', '--foo', help='old foo help')359>>> parser.add_argument('--foo', help='new foo help')360Traceback (most recent call last):361 ..362ArgumentError: argument --foo: conflicting option string(s): --foo363```364365Иногда (например, при использовании [parents](https://python-all.ru/3.12/library/argparse.html#parents)) бывает полезно просто переопределить все старые аргументы с той же строкой опции. Для получения такого поведения значение `'resolve'` можно передать в аргумент `conflict_handler=` функции [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):366367```python368>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')369>>> parser.add_argument('-f', '--foo', help='old foo help')370>>> parser.add_argument('--foo', help='new foo help')371>>> parser.print_help()372usage: PROG [-h] [-f FOO] [--foo FOO]373374options:375 -h, --help show this help message and exit376 -f FOO old foo help377 --foo FOO new foo help378```379380Обратите внимание, что объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) удаляют действие только в том случае, если все его строки опций переопределены. Поэтому в приведённом выше примере старое действие `-f/--foo` сохраняется как действие `-f`, поскольку была переопределена только строка опции `--foo`.381382### add\_help383384По умолчанию объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) добавляют опцию, которая просто отображает справочное сообщение синтаксического анализатора. Если в командной строке указано `-h` или `--help`, будет выведена справка `ArgumentParser`.385386Иногда может быть полезно отключить добавление этой опции справки. Это можно сделать, передав `False` в качестве аргумента `add_help=` функции [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser):387388```python389>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)390>>> parser.add_argument('--foo', help='foo help')391>>> parser.print_help()392usage: PROG [--foo FOO]393394options:395 --foo FOO foo help396```397398Обычно опция справки – это `-h/--help`. Исключение составляет случай, когда указан `prefix_chars=` и не включает `-`; в этом случае `-h` и `--help` не являются допустимыми опциями. В таком случае первый символ в `prefix_chars` используется в качестве префикса для опций справки:399400```python401>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')402>>> parser.print_help()403usage: PROG [+h]404405options:406 +h, ++help show this help message and exit407```408409### exit\_on\_error410411Обычно при передаче недопустимого списка аргументов методу [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) объекта [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) он выводит *сообщение* в [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr) и завершает работу с кодом возврата 2.412413Если требуется перехватывать ошибки вручную, эту возможность можно включить, установив `exit_on_error` в `False`:414415```python416>>> parser = argparse.ArgumentParser(exit_on_error=False)417>>> parser.add_argument('--integers', type=int)418_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)419>>> try:420... parser.parse_args('--integers a'.split())421... except argparse.ArgumentError:422... print('Catching an argumentError')423...424Catching an argumentError425```426427Добавлено в версии 3.9.428429## Метод add\_argument()430431#### `ArgumentParser.add_argument(name or flags..., *[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])`432433Определяет, как должен разбираться один аргумент командной строки. Каждый параметр подробно описан ниже, а кратко они таковы:434435- [name or flags](https://python-all.ru/3.12/library/argparse.html#name-or-flags) – имя или список строк параметров, например `'foo'` или `'-f', '--foo'`.436- [action](https://python-all.ru/3.12/library/argparse.html#action) – базовый тип действия, которое выполняется при встрече этого аргумента в командной строке.437- [nargs](https://python-all.ru/3.12/library/argparse.html#nargs) – количество аргументов командной строки, которое должно быть потреблено.438- [const](https://python-all.ru/3.12/library/argparse.html#const) – постоянное значение, требуемое некоторыми значениями [action](https://python-all.ru/3.12/library/argparse.html#action) и [nargs](https://python-all.ru/3.12/library/argparse.html#nargs).439- [default](https://python-all.ru/3.12/library/argparse.html#default) – значение, которое используется, если аргумент отсутствует в командной строке и в объекте namespace.440- [type](https://python-all.ru/3.12/library/argparse.html#type) – тип, в который следует преобразовать аргумент командной строки.441- [choices](https://python-all.ru/3.12/library/argparse.html#choices) – последовательность допустимых значений для аргумента.442- [required](https://python-all.ru/3.12/library/argparse.html#required) – может ли параметр командной строки быть опущен (только для опциональных параметров).443- [help](https://python-all.ru/3.12/library/argparse.html#help) – краткое описание того, что делает аргумент.444- [metavar](https://python-all.ru/3.12/library/argparse.html#metavar) – имя аргумента в сообщениях об использовании.445- [dest](https://python-all.ru/3.12/library/argparse.html#dest) – имя атрибута, добавляемого в объект, возвращаемый [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args).446447В следующих разделах описывается, как используется каждый из этих параметров.448449### имя или флаги450451Методу [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) необходимо знать, ожидается ли опциональный аргумент (например, `-f` или `--foo`) или позиционный (например, список имён файлов). Поэтому первыми аргументами, передаваемыми в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), должны быть либо серия флагов, либо просто имя аргумента.452453Например, опциональный аргумент можно создать так:454455```python456>>> parser.add_argument('-f', '--foo')457```458459а позиционный – так:460461```python462>>> parser.add_argument('bar')463```464465При вызове [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) опциональные аргументы опознаются по префиксу `-`, а остальные аргументы считаются позиционными:466467```python468>>> parser = argparse.ArgumentParser(prog='PROG')469>>> parser.add_argument('-f', '--foo')470>>> parser.add_argument('bar')471>>> parser.parse_args(['BAR'])472Namespace(bar='BAR', foo=None)473>>> parser.parse_args(['BAR', '--foo', 'FOO'])474Namespace(bar='BAR', foo='FOO')475>>> parser.parse_args(['--foo', 'FOO'])476usage: PROG [-h] [-f FOO] bar477PROG: error: the following arguments are required: bar478```479480### action481482Объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) связывают аргументы командной строки с действиями. Эти действия могут делать с аргументами практически что угодно, но чаще всего они просто добавляют атрибут в объект, возвращаемый [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args). Ключевой аргумент `action` определяет, как следует обрабатывать аргументы командной строки. Доступны следующие действия:483484- `'store'` – просто сохраняет значение аргумента. Это действие по умолчанию.485- `'store_const'` – сохраняет значение, указанное ключевым аргументом [const](https://python-all.ru/3.12/library/argparse.html#const); обратите внимание, что ключевой аргумент [const](https://python-all.ru/3.12/library/argparse.html#const) по умолчанию равен `None`. Действие `'store_const'` чаще всего используется с опциональными аргументами, задающими какой-либо флаг. Например:486487 ```python488 >>> parser = argparse.ArgumentParser()489 >>> parser.add_argument('--foo', action='store_const', const=42)490 >>> parser.parse_args(['--foo'])491 Namespace(foo=42)492 ```493- `'store_true'` и `'store_false'` – это частные случаи `'store_const'`, используемые для хранения значений `True` и `False` соответственно. Кроме того, они создают значения по умолчанию `False` и `True` соответственно:494495 ```python496 >>> parser = argparse.ArgumentParser()497 >>> parser.add_argument('--foo', action='store_true')498 >>> parser.add_argument('--bar', action='store_false')499 >>> parser.add_argument('--baz', action='store_false')500 >>> parser.parse_args('--foo --bar'.split())501 Namespace(foo=True, bar=False, baz=True)502 ```503- `'append'` – сохраняет список и добавляет в него каждое значение аргумента. Это полезно, чтобы разрешить указывать параметр несколько раз. Если значение по умолчанию не пусто, элементы по умолчанию будут присутствовать в разобранном значении для этого параметра, а все значения из командной строки будут добавлены после них. Пример использования:504505 ```python506 >>> parser = argparse.ArgumentParser()507 >>> parser.add_argument('--foo', action='append')508 >>> parser.parse_args('--foo 1 --foo 2'.split())509 Namespace(foo=['1', '2'])510 ```511- `'append_const'` – сохраняет список и добавляет в него значение, указанное ключевым аргументом [const](https://python-all.ru/3.12/library/argparse.html#const); обратите внимание, что ключевой аргумент [const](https://python-all.ru/3.12/library/argparse.html#const) по умолчанию равен `None`. Действие `'append_const'` обычно полезно, когда несколько аргументов должны сохранять константы в один и тот же список. Например:512513 ```python514 >>> parser = argparse.ArgumentParser()515 >>> parser.add_argument('--str', dest='types', action='append_const', const=str)516 >>> parser.add_argument('--int', dest='types', action='append_const', const=int)517 >>> parser.parse_args('--str --int'.split())518 Namespace(types=[<class 'str'>, <class 'int'>])519 ```520- `'extend'` – сохраняет список и добавляет в него каждый элемент из списка многозначных аргументов. Действие `'extend'` обычно используется с ключевым аргументом [nargs](https://python-all.ru/3.12/library/argparse.html#nargs), равным `'+'` или `'*'`. Обратите внимание: когда [nargs](https://python-all.ru/3.12/library/argparse.html#nargs) равен `None` (по умолчанию) или `'?'`, каждый символ строки аргумента будет добавлен в список. Пример использования:521522 ```python523 >>> parser = argparse.ArgumentParser()524 >>> parser.add_argument("--foo", action="extend", nargs="+", type=str)525 >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])526 Namespace(foo=['f1', 'f2', 'f3', 'f4'])527 ```528529 Добавлено в версии 3.8.530- `'count'` – подсчитывает, сколько раз встречается именованный аргумент. Например, это полезно для повышения уровня подробности вывода:531532 ```python533 >>> parser = argparse.ArgumentParser()534 >>> parser.add_argument('--verbose', '-v', action='count', default=0)535 >>> parser.parse_args(['-vvv'])536 Namespace(verbose=3)537 ```538539 Обратите внимание: значение *default* будет `None`, если только оно явно не установлено в *0*.540- `'help'` – выводит полное справочное сообщение для всех параметров текущего анализатора и завершает работу. По умолчанию действие справки автоматически добавляется в анализатор. Подробности о том, как формируется вывод, см. в [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser).541- `'version'` – ожидает именованный аргумент `version=` в вызове [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) и при вызове выводит информацию о версии и завершает работу:542543 ```python544 >>> import argparse545 >>> parser = argparse.ArgumentParser(prog='PROG')546 >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')547 >>> parser.parse_args(['--version'])548 PROG 2.0549 ```550551Только действия, которые потребляют аргументы командной строки (например, `'store'`, `'append'` или `'extend'`), могут использоваться с позиционными аргументами.552553#### `class argparse.BooleanOptionalAction`554555Можно также указать произвольное действие, передав подкласс [`Action`](https://python-all.ru/3.12/library/argparse.html#argparse.Action) или другой объект, реализующий тот же интерфейс. Класс `BooleanOptionalAction` доступен в `argparse` и добавляет поддержку булевых действий, таких как `--foo` и `--no-foo`:556557```python558>>> import argparse559>>> parser = argparse.ArgumentParser()560>>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)561>>> parser.parse_args(['--no-foo'])562Namespace(foo=False)563```564565Добавлено в версии 3.9.566567Рекомендуемый способ создания пользовательского действия – расширить [`Action`](https://python-all.ru/3.12/library/argparse.html#argparse.Action), переопределив метод `__call__()` и, при необходимости, методы `__init__()` и `format_usage()`. Также можно зарегистрировать пользовательские действия с помощью метода [`register()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.register) и ссылаться на них по зарегистрированному имени.568569Пример пользовательского действия:570571```python572>>> class FooAction(argparse.Action):573... def __init__(self, option_strings, dest, nargs=None, **kwargs):574... if nargs is not None:575... raise ValueError("nargs not allowed")576... super().__init__(option_strings, dest, **kwargs)577... def __call__(self, parser, namespace, values, option_string=None):578... print('%r %r %r' % (namespace, values, option_string))579... setattr(namespace, self.dest, values)580...581>>> parser = argparse.ArgumentParser()582>>> parser.add_argument('--foo', action=FooAction)583>>> parser.add_argument('bar', action=FooAction)584>>> args = parser.parse_args('1 --foo 2'.split())585Namespace(bar=None, foo=None) '1' None586Namespace(bar='1', foo=None) '2' '--foo'587>>> args588Namespace(bar='1', foo='2')589```590591Подробнее см. в [`Action`](https://python-all.ru/3.12/library/argparse.html#argparse.Action).592593### nargs594595Объекты [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) обычно связывают один аргумент командной строки с одним выполняемым действием. Именованный аргумент `nargs` связывает другое количество аргументов командной строки с одним действием. См. также [Указание неоднозначных аргументов](https://python-all.ru/3.12/howto/argparse.html#specifying-ambiguous-arguments). Поддерживаемые значения:596597- `N` (целое число). Аргументы `N` из командной строки будут собраны в список. Например:598599 ```python600 >>> parser = argparse.ArgumentParser()601 >>> parser.add_argument('--foo', nargs=2)602 >>> parser.add_argument('bar', nargs=1)603 >>> parser.parse_args('c --foo a b'.split())604 Namespace(bar=['c'], foo=['a', 'b'])605 ```606607 Обратите внимание, что `nargs=1` создаёт список из одного элемента. Это отличается от поведения по умолчанию, при котором элемент создаётся сам по себе.608609- `'?'`. Если возможно, будет потреблён один аргумент командной строки и выдан как отдельный элемент. Если аргумент командной строки отсутствует, будет выдано значение из [default](https://python-all.ru/3.12/library/argparse.html#default). Обратите внимание, что для необязательных аргументов есть дополнительный случай: строка параметра присутствует, но за ней не следует аргумент командной строки. В этом случае будет выдано значение из [const](https://python-all.ru/3.12/library/argparse.html#const). Некоторые примеры для иллюстрации:610611 ```python612 >>> parser = argparse.ArgumentParser()613 >>> parser.add_argument('--foo', nargs='?', const='c', default='d')614 >>> parser.add_argument('bar', nargs='?', default='d')615 >>> parser.parse_args(['XX', '--foo', 'YY'])616 Namespace(bar='XX', foo='YY')617 >>> parser.parse_args(['XX', '--foo'])618 Namespace(bar='XX', foo='c')619 >>> parser.parse_args([])620 Namespace(bar='d', foo='d')621 ```622623 Одно из наиболее распространённых применений `nargs='?'` – разрешение необязательных входных и выходных файлов:624625 ```python626 >>> parser = argparse.ArgumentParser()627 >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),628 ... default=sys.stdin)629 >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),630 ... default=sys.stdout)631 >>> parser.parse_args(['input.txt', 'output.txt'])632 Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,633 outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)634 >>> parser.parse_args([])635 Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,636 outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)637 ```638639- `'*'`. Все присутствующие аргументы командной строки собираются в список. Обратите внимание, что обычно не имеет смысла указывать более одного позиционного аргумента с `nargs='*'`, но возможно несколько необязательных аргументов с `nargs='*'`. Например:640641 ```python642 >>> parser = argparse.ArgumentParser()643 >>> parser.add_argument('--foo', nargs='*')644 >>> parser.add_argument('--bar', nargs='*')645 >>> parser.add_argument('baz', nargs='*')646 >>> parser.parse_args('a b --foo x y --bar 1 2'.split())647 Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])648 ```649650- `'+'`. Как и `'*'`, все присутствующие аргументы командной строки собираются в список. Кроме того, будет выдано сообщение об ошибке, если не было хотя бы одного аргумента командной строки. Например:651652 ```python653 >>> parser = argparse.ArgumentParser(prog='PROG')654 >>> parser.add_argument('foo', nargs='+')655 >>> parser.parse_args(['a', 'b'])656 Namespace(foo=['a', 'b'])657 >>> parser.parse_args([])658 usage: PROG [-h] foo [foo ...]659 PROG: error: the following arguments are required: foo660 ```661662Если именованный аргумент `nargs` не указан, количество потребляемых аргументов определяется действием [action](https://python-all.ru/3.12/library/argparse.html#action). Обычно это означает, что будет потреблён один аргумент командной строки и выдан один элемент (не список). Действия, которые не потребляют аргументы командной строки (например, `'store_const'`), устанавливают `nargs=0`.663664### const665666Аргумент `const` функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) используется для хранения постоянных значений, которые не считываются из командной строки, но требуются для различных действий [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Два наиболее распространённых его применения:667668- Когда [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) вызывается с `action='store_const'` или `action='append_const'`. Эти действия добавляют значение `const` к одному из атрибутов объекта, возвращаемого [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args). Примеры см. в описании [action](https://python-all.ru/3.12/library/argparse.html#action). Если `const` не передан в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), он получит значение по умолчанию `None`.669- Когда [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) вызывается со строками параметров (например, `-f` или `--foo`) и `nargs='?'`. Это создаёт дополнительный аргумент, за которым может следовать ноль или один аргумент командной строки. При разборе командной строки, если строка параметра встречена без следующего за ней аргумента командной строки, значение `const` будет считаться равным `None`. См. описание [nargs](https://python-all.ru/3.12/library/argparse.html#nargs) с примерами.670671Изменено в версии 3.11: `const=None` по умолчанию, в том числе когда `action='append_const'` или `action='store_const'`.672673### default674675Все необязательные аргументы и некоторые позиционные аргументы могут быть опущены в командной строке. Именованный аргумент `default` функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), значение которого по умолчанию равно `None`, указывает, какое значение следует использовать, если аргумент командной строки отсутствует. Для необязательных аргументов значение `default` используется, когда строка параметра отсутствовала в командной строке:676677```python678>>> parser = argparse.ArgumentParser()679>>> parser.add_argument('--foo', default=42)680>>> parser.parse_args(['--foo', '2'])681Namespace(foo='2')682>>> parser.parse_args([])683Namespace(foo=42)684```685686Если в целевом пространстве имён уже установлен атрибут, действие *default* не перезапишет его:687688```python689>>> parser = argparse.ArgumentParser()690>>> parser.add_argument('--foo', default=42)691>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))692Namespace(foo=101)693```694695Если значение `default` является строкой, анализатор разбирает его так, как если бы это был аргумент командной строки. В частности, анализатор применяет любой аргумент преобразования [type](https://python-all.ru/3.12/library/argparse.html#type), если он указан, перед установкой атрибута в возвращаемом значении [`Namespace`](https://python-all.ru/3.12/library/argparse.html#argparse.Namespace). В противном случае анализатор использует значение как есть:696697```python698>>> parser = argparse.ArgumentParser()699>>> parser.add_argument('--length', default='10', type=int)700>>> parser.add_argument('--width', default=10.5, type=int)701>>> parser.parse_args()702Namespace(length=10, width=10.5)703```704705Для позиционных аргументов с [nargs](https://python-all.ru/3.12/library/argparse.html#nargs), равным `?` или `*`, значение `default` используется, когда аргумент командной строки отсутствовал:706707```python708>>> parser = argparse.ArgumentParser()709>>> parser.add_argument('foo', nargs='?', default=42)710>>> parser.parse_args(['a'])711Namespace(foo='a')712>>> parser.parse_args([])713Namespace(foo=42)714```715716Для аргументов [required](https://python-all.ru/3.12/library/argparse.html#required) значение `default` игнорируется. Например, это относится к позиционным аргументам со значениями [nargs](https://python-all.ru/3.12/library/argparse.html#nargs), отличными от `?` или `*`, или к необязательным аргументам, помеченным как `required=True`.717718Указание `default=argparse.SUPPRESS` приводит к тому, что атрибут не добавляется, если аргумент командной строки отсутствовал:719720```python721>>> parser = argparse.ArgumentParser()722>>> parser.add_argument('--foo', default=argparse.SUPPRESS)723>>> parser.parse_args([])724Namespace()725>>> parser.parse_args(['--foo', '1'])726Namespace(foo='1')727```728729### тип730731По умолчанию анализатор считывает аргументы командной строки как простые строки. Однако довольно часто строку командной строки следует интерпретировать как другой тип, например [`float`](https://python-all.ru/3.12/library/functions.html#float) или [`int`](https://python-all.ru/3.12/library/functions.html#int). Именованный аргумент `type` функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) позволяет выполнять любые необходимые проверки и преобразования типов.732733Если именованный аргумент [type](https://python-all.ru/3.12/library/argparse.html#type) используется вместе с [default](https://python-all.ru/3.12/library/argparse.html#default), преобразователь типа применяется только в том случае, если значение по умолчанию является строкой.734735Аргумент `type` может быть вызываемым объектом, принимающим одну строку, или именем зарегистрированного типа (см. [`register()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.register)). Если функция вызывает исключение [`ArgumentTypeError`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentTypeError), [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) или [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), исключение перехватывается и выводится хорошо оформленное сообщение об ошибке. Другие типы исключений не обрабатываются.736737Распространённые встроенные типы и функции можно использовать в качестве преобразователей типов:738739```python740import argparse741import pathlib742743parser = argparse.ArgumentParser()744parser.add_argument('count', type=int)745parser.add_argument('distance', type=float)746parser.add_argument('street', type=ascii)747parser.add_argument('code_point', type=ord)748parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))749parser.add_argument('datapath', type=pathlib.Path)750```751752Пользовательские функции также можно использовать:753754```pycon755>>> def hyphenated(string):756... return '-'.join([word[:4] for word in string.casefold().split()])757...758>>> parser = argparse.ArgumentParser()759>>> _ = parser.add_argument('short_title', type=hyphenated)760>>> parser.parse_args(['"The Tale of Two Cities"'])761Namespace(short_title='"the-tale-of-two-citi')762```763764Функция [`bool()`](https://python-all.ru/3.12/library/functions.html#bool) не рекомендуется в качестве преобразователя типов. Она лишь преобразует пустые строки в `False`, а непустые – в `True`. Обычно это не то, что нужно.765766В целом, ключевое слово `type` – это удобство, которое следует использовать только для простых преобразований, способных вызывать лишь одно из трёх поддерживаемых исключений. Всё, что связано с более сложной обработкой ошибок или управлением ресурсами, должно выполняться ниже по потоку после разбора аргументов.767768Например, преобразования JSON или YAML содержат сложные случаи ошибок, которые требуют более детального отчёта, чем может дать ключевое слово `type`. Сообщение [`JSONDecodeError`](https://python-all.ru/3.12/library/json.html#json.JSONDecodeError) не будет хорошо отформатировано, а исключение [`FileNotFoundError`](https://python-all.ru/3.12/library/exceptions.html#FileNotFoundError) вообще не будет обработано.769770Даже [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType) имеет ограничения при использовании с ключевым словом `type`. Если один аргумент использует [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType), а затем следующий аргумент завершается ошибкой, сообщается об ошибке, но файл не закрывается автоматически. В этом случае лучше подождать, пока завершит работу парсер, а затем использовать оператор [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with) для управления файлами.771772Для проверок типов, которые просто сравнивают с фиксированным набором значений, рассмотрите вместо этого использование ключевого слова [choices](https://python-all.ru/3.12/library/argparse.html#choices).773774### choices775776Некоторые аргументы командной строки должны выбираться из ограниченного набора значений. Это можно обработать, передав объект-последовательность в качестве ключевого аргумента *choices* в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument). При разборе командной строки значения аргументов будут проверены, и если аргумент не окажется среди допустимых значений, будет выведено сообщение об ошибке:777778```python779>>> parser = argparse.ArgumentParser(prog='game.py')780>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])781>>> parser.parse_args(['rock'])782Namespace(move='rock')783>>> parser.parse_args(['fire'])784usage: game.py [-h] {rock,paper,scissors}785game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',786'paper', 'scissors')787```788789Обратите внимание: проверка принадлежности последовательности *choices* выполняется после любых преобразований [type](https://python-all.ru/3.12/library/argparse.html#type), поэтому тип объектов в последовательности *choices* должен соответствовать указанному [type](https://python-all.ru/3.12/library/argparse.html#type).790791В качестве значения *choices* можно передать любую последовательность, поэтому поддерживаются объекты [`list`](https://python-all.ru/3.12/library/stdtypes.html#list), объекты [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple) и пользовательские последовательности.792793Использование [`enum.Enum`](https://python-all.ru/3.12/library/enum.html#enum.Enum) не рекомендуется, поскольку сложно контролировать его отображение в сообщениях об использовании, справке и ошибках.794795Форматированные choices переопределяют значение *metavar* по умолчанию, которое обычно выводится из *dest*. Обычно это именно то, что нужно, поскольку пользователь никогда не видит параметр *dest*. Если такое отображение нежелательно (например, из-за большого количества вариантов), просто укажите явный [metavar](https://python-all.ru/3.12/library/argparse.html#metavar).796797### required798799В целом, модуль `argparse` предполагает, что флаги вида `-f` и `--bar` обозначают *необязательные* аргументы, которые всегда можно опустить в командной строке. Чтобы сделать опцию *обязательной*, для ключевого аргумента `required=` функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) можно указать `True`:800801```python802>>> parser = argparse.ArgumentParser()803>>> parser.add_argument('--foo', required=True)804>>> parser.parse_args(['--foo', 'BAR'])805Namespace(foo='BAR')806>>> parser.parse_args([])807usage: [-h] --foo FOO808: error: the following arguments are required: --foo809```810811Как показано в примере, если опция помечена как `required`, [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) сообщит об ошибке, если эта опция отсутствует в командной строке.812813> **Примечание**814>815> Обязательные опции обычно считаются дурным тоном, поскольку пользователи ожидают, что *опции* будут *необязательными*, поэтому их следует по возможности избегать.816817### help818819Значение `help` – это строка с кратким описанием аргумента. Когда пользователь запрашивает справку (обычно с помощью `-h` или `--help` в командной строке), эти описания `help` отображаются для каждого аргумента.820821Строки `help` могут содержать различные спецификаторы формата, чтобы избежать повторения таких элементов, как имя программы или [значение по умолчанию](https://python-all.ru/3.12/library/argparse.html#default) аргумента. Доступные спецификаторы включают имя программы, `%(prog)s` и большинство ключевых аргументов функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), например `%(default)s`, `%(type)s` и т.д.:822823```python824>>> parser = argparse.ArgumentParser(prog='frobble')825>>> parser.add_argument('bar', nargs='?', type=int, default=42,826... help='the bar to %(prog)s (default: %(default)s)')827>>> parser.print_help()828usage: frobble [-h] [bar]829830positional arguments:831 bar the bar to frobble (default: 42)832833options:834 -h, --help show this help message and exit835```836837Поскольку строка справки поддерживает %-форматирование, если требуется, чтобы в ней отображался литерал `%`, его нужно экранировать как `%%`.838839`argparse` поддерживает скрытие записи справки для определённых опций путём установки значения `help` в `argparse.SUPPRESS`:840841```python842>>> parser = argparse.ArgumentParser(prog='frobble')843>>> parser.add_argument('--foo', help=argparse.SUPPRESS)844>>> parser.print_help()845usage: frobble [-h]846847options:848 -h, --help show this help message and exit849```850851### metavar852853Когда [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) генерирует сообщения справки, ему нужен способ ссылаться на каждый ожидаемый аргумент. По умолчанию объекты `ArgumentParser` используют значение [dest](https://python-all.ru/3.12/library/argparse.html#dest) в качестве «имени» каждого объекта. Для действий с позиционными аргументами значение [dest](https://python-all.ru/3.12/library/argparse.html#dest) используется напрямую, а для действий с необязательными аргументами значение [dest](https://python-all.ru/3.12/library/argparse.html#dest) пишется заглавными буквами. Таким образом, одиночный позиционный аргумент с `dest='bar'` будет называться `bar`. Одиночный необязательный аргумент `--foo`, за которым должен следовать один аргумент командной строки, будет называться `FOO`. Пример:854855```python856>>> parser = argparse.ArgumentParser()857>>> parser.add_argument('--foo')858>>> parser.add_argument('bar')859>>> parser.parse_args('X --foo Y'.split())860Namespace(bar='X', foo='Y')861>>> parser.print_help()862usage: [-h] [--foo FOO] bar863864positional arguments:865 bar866867options:868 -h, --help show this help message and exit869 --foo FOO870```871872Альтернативное имя можно указать с помощью `metavar`:873874```python875>>> parser = argparse.ArgumentParser()876>>> parser.add_argument('--foo', metavar='YYY')877>>> parser.add_argument('bar', metavar='XXX')878>>> parser.parse_args('X --foo Y'.split())879Namespace(bar='X', foo='Y')880>>> parser.print_help()881usage: [-h] [--foo YYY] XXX882883positional arguments:884 XXX885886options:887 -h, --help show this help message and exit888 --foo YYY889```890891Обратите внимание, что `metavar` изменяет только *отображаемое* имя – имя атрибута объекта [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) по-прежнему определяется значением [dest](https://python-all.ru/3.12/library/argparse.html#dest).892893Разные значения `nargs` могут привести к тому, что метапеременная будет использована несколько раз. Передача кортежа в `metavar` задаёт различное отображение для каждого из аргументов:894895```python896>>> parser = argparse.ArgumentParser(prog='PROG')897>>> parser.add_argument('-x', nargs=2)898>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))899>>> parser.print_help()900usage: PROG [-h] [-x X X] [--foo bar baz]901902options:903 -h, --help show this help message and exit904 -x X X905 --foo bar baz906```907908### dest909910Большинство действий [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) добавляют некоторое значение как атрибут объекта, возвращаемого [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args). Имя этого атрибута определяется ключевым аргументом `dest` функции [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument). Для действий с позиционными аргументами `dest` обычно передаётся первым аргументом в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument):911912```python913>>> parser = argparse.ArgumentParser()914>>> parser.add_argument('bar')915>>> parser.parse_args(['XXX'])916Namespace(bar='XXX')917```918919Для действий необязательных аргументов значение `dest` обычно выводится из строк опций. [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) генерирует значение `dest`, беря первую длинную строку опции и удаляя начальную строку `--`. Если длинные строки опций не были предоставлены, `dest` будет получен из первой короткой строки опции путем удаления начального символа `-`. Любые внутренние символы `-` будут преобразованы в символы `_`, чтобы гарантировать, что строка является допустимым именем атрибута. Примеры ниже иллюстрируют это поведение:920921```python922>>> parser = argparse.ArgumentParser()923>>> parser.add_argument('-f', '--foo-bar', '--foo')924>>> parser.add_argument('-x', '-y')925>>> parser.parse_args('-f 1 -x 2'.split())926Namespace(foo_bar='1', x='2')927>>> parser.parse_args('--foo 1 -y 2'.split())928Namespace(foo_bar='1', x='2')929```930931`dest` позволяет указать пользовательское имя атрибута:932933```python934>>> parser = argparse.ArgumentParser()935>>> parser.add_argument('--foo', dest='bar')936>>> parser.parse_args('--foo XXX'.split())937Namespace(bar='XXX')938```939940### Классы действий941942`Action` классы реализуют Action API – вызываемый объект, который возвращает вызываемый объект, обрабатывающий аргументы из командной строки. Любой объект, соответствующий этому API, может быть передан в качестве параметра `action` в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument).943944#### `class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)`945946`Action` объекты используются [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) для представления информации, необходимой для разбора одного аргумента из одной или нескольких строк командной строки. Класс `Action` должен принимать два позиционных аргумента и любые ключевые аргументы, переданные в [`ArgumentParser.add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), кроме самого `action`.947948Экземпляры `Action` (или возвращаемое значение любого вызываемого объекта для параметра `action`) должны иметь атрибуты `dest`, `option_strings`, `default`, `type`, `required`, `help` и т.д. Проще всего гарантировать наличие этих атрибутов – вызвать `Action.__init__()`.949950#### `__call__(parser, namespace, values, option_string=None)`951952Экземпляры `Action` должны быть вызываемыми, поэтому подклассы должны переопределять метод `__call__()`, который принимает четыре параметра:953954- *parser* – объект [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser), содержащий это действие.955- *namespace* – объект [`Namespace`](https://python-all.ru/3.12/library/argparse.html#argparse.Namespace), который будет возвращён [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args). Обычно действия добавляют атрибут к этому объекту с помощью [`setattr()`](https://python-all.ru/3.12/library/functions.html#setattr).956- *values* – связанные аргументы командной строки с применёнными преобразованиями типов. Преобразования типов задаются ключевым аргументом [type](https://python-all.ru/3.12/library/argparse.html#type) в [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument).957- *option\_string* – строка параметра, которая использовалась для вызова этого действия. Аргумент `option_string` необязателен и будет отсутствовать, если действие связано с позиционным аргументом.958959Метод `__call__()` может выполнять произвольные действия, но обычно устанавливает атрибуты объекта `namespace` на основе `dest` и `values`.960961#### `format_usage()`962963Подклассы `Action` могут определить метод `format_usage()` без аргументов, возвращающий строку, которая будет использоваться при выводе справки об использовании программы. Если такой метод не предоставлен, используется разумное значение по умолчанию.964965## Метод parse\_args()966967#### `ArgumentParser.parse_args(args=None, namespace=None)`968969Преобразует строки аргументов в объекты и назначает их в качестве атрибутов пространства имён. Возвращает заполненное пространство имён.970971Предыдущие вызовы [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument) определяют, какие объекты создаются и как они назначаются. Подробнее см. документацию `add_argument()`.972973- [args](https://python-all.ru/3.12/library/argparse.html#args) – список строк для разбора. По умолчанию берётся из [`sys.argv`](https://python-all.ru/3.12/library/sys.html#sys.argv).974- [namespace](https://python-all.ru/3.12/library/argparse.html#namespace) – объект, в который будут помещены атрибуты. По умолчанию – новый пустой объект [`Namespace`](https://python-all.ru/3.12/library/argparse.html#argparse.Namespace).975976### Синтаксис значений параметров977978Метод [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) поддерживает несколько способов указания значения параметра (если он принимает значение). В простейшем случае параметр и его значение передаются как два отдельных аргумента:979980```python981>>> parser = argparse.ArgumentParser(prog='PROG')982>>> parser.add_argument('-x')983>>> parser.add_argument('--foo')984>>> parser.parse_args(['-x', 'X'])985Namespace(foo=None, x='X')986>>> parser.parse_args(['--foo', 'FOO'])987Namespace(foo='FOO', x=None)988```989990Для длинных параметров (с именами длиннее одного символа) параметр и значение могут быть переданы как один аргумент командной строки, используя `=` для их разделения:991992```python993>>> parser.parse_args(['--foo=FOO'])994Namespace(foo='FOO', x=None)995```996997Для коротких опций (опции длиной в один символ) опция и её значение могут быть объединены:998999```python1000>>> parser.parse_args(['-xX'])1001Namespace(foo=None, x='X')1002```10031004Несколько коротких опций можно объединить, используя только один префикс `-`, при условии, что только последняя опция (или ни одна из них) требует значения:10051006```python1007>>> parser = argparse.ArgumentParser(prog='PROG')1008>>> parser.add_argument('-x', action='store_true')1009>>> parser.add_argument('-y', action='store_true')1010>>> parser.add_argument('-z')1011>>> parser.parse_args(['-xyzZ'])1012Namespace(x=True, y=True, z='Z')1013```10141015### Недопустимые аргументы10161017При разборе командной строки [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) проверяет различные ошибки, включая неоднозначные опции, некорректные типы, неверные опции, неправильное количество позиционных аргументов и т.д. При обнаружении такой ошибки программа завершается и выводит сообщение об ошибке вместе со справкой по использованию:10181019```python1020>>> parser = argparse.ArgumentParser(prog='PROG')1021>>> parser.add_argument('--foo', type=int)1022>>> parser.add_argument('bar', nargs='?')10231024>>> # недопустимый тип1025>>> parser.parse_args(['--foo', 'spam'])1026usage: PROG [-h] [--foo FOO] [bar]1027PROG: error: argument --foo: invalid int value: 'spam'10281029>>> # недопустимая опция1030>>> parser.parse_args(['--bar'])1031usage: PROG [-h] [--foo FOO] [bar]1032PROG: error: no such option: --bar10331034>>> # неверное количество аргументов1035>>> parser.parse_args(['spam', 'badger'])1036usage: PROG [-h] [--foo FOO] [bar]1037PROG: error: extra arguments found: badger1038```10391040### Аргументы, содержащие `-`10411042Метод [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) старается выдавать ошибки всякий раз, когда пользователь явно ошибся, но некоторые ситуации по своей природе неоднозначны. Например, аргумент командной строки `-1` может быть как попыткой указать опцию, так и попыткой передать позиционный аргумент. Метод [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) здесь действует осторожно: позиционные аргументы могут начинаться с `-` только если они похожи на отрицательные числа, и в анализаторе нет опций, которые выглядят как отрицательные числа:10431044```python1045>>> parser = argparse.ArgumentParser(prog='PROG')1046>>> parser.add_argument('-x')1047>>> parser.add_argument('foo', nargs='?')10481049>>> # нет опций с отрицательными числами, поэтому -1 – позиционный аргумент1050>>> parser.parse_args(['-x', '-1'])1051Namespace(foo=None, x='-1')10521053>>> # нет опций с отрицательными числами, поэтому -1 и -5 – позиционные аргументы1054>>> parser.parse_args(['-x', '-1', '-5'])1055Namespace(foo='-5', x='-1')10561057>>> parser = argparse.ArgumentParser(prog='PROG')1058>>> parser.add_argument('-1', dest='one')1059>>> parser.add_argument('foo', nargs='?')10601061>>> # опции с отрицательными числами присутствуют, поэтому -1 – это опция1062>>> parser.parse_args(['-1', 'X'])1063Namespace(foo=None, one='X')10641065>>> # опции с отрицательными числами присутствуют, поэтому -2 – это опция1066>>> parser.parse_args(['-2'])1067usage: PROG [-h] [-1 ONE] [foo]1068PROG: error: no such option: -210691070>>> # опции с отрицательными числами присутствуют, поэтому обе -1 – это опции1071>>> parser.parse_args(['-1', '-1'])1072usage: PROG [-h] [-1 ONE] [foo]1073PROG: error: argument -1: expected one argument1074```10751076Если позиционные аргументы должны начинаться с `-` и не похожи на отрицательные числа, можно вставить псевдоаргумент `'--'`, который сообщает [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args), что всё после него является позиционным аргументом:10771078```python1079>>> parser.parse_args(['--', '-f'])1080Namespace(foo='-f', one=None)1081```10821083См. также [руководство по argparse о неоднозначных аргументах](https://python-all.ru/3.12/howto/argparse.html#specifying-ambiguous-arguments) для получения дополнительных сведений.10841085### Сокращения аргументов (совпадение по префиксу)10861087Метод [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) [по умолчанию](https://python-all.ru/3.12/library/argparse.html#allow-abbrev) позволяет сокращать длинные опции до префикса, если сокращение является однозначным (префикс соответствует уникальной опции):10881089```python1090>>> parser = argparse.ArgumentParser(prog='PROG')1091>>> parser.add_argument('-bacon')1092>>> parser.add_argument('-badger')1093>>> parser.parse_args('-bac MMM'.split())1094Namespace(bacon='MMM', badger=None)1095>>> parser.parse_args('-bad WOOD'.split())1096Namespace(bacon=None, badger='WOOD')1097>>> parser.parse_args('-ba BA'.split())1098usage: PROG [-h] [-bacon BACON] [-badger BADGER]1099PROG: error: ambiguous option: -ba could match -badger, -bacon1100```11011102Выдаётся ошибка для аргументов, которые могут соответствовать нескольким опциям. Эту возможность можно отключить, установив [allow\_abbrev](https://python-all.ru/3.12/library/argparse.html#allow-abbrev) в `False`.11031104### За пределами `sys.argv`11051106Иногда бывает полезно, чтобы [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) разбирал аргументы, отличные от аргументов [`sys.argv`](https://python-all.ru/3.12/library/sys.html#sys.argv). Это можно сделать, передав список строк в [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args). Это удобно для тестирования в интерактивной оболочке:11071108```python1109>>> parser = argparse.ArgumentParser()1110>>> parser.add_argument(1111... 'integers', metavar='int', type=int, choices=range(10),1112... nargs='+', help='an integer in the range 0..9')1113>>> parser.add_argument(1114... '--sum', dest='accumulate', action='store_const', const=sum,1115... default=max, help='sum the integers (default: find the max)')1116>>> parser.parse_args(['1', '2', '3', '4'])1117Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])1118>>> parser.parse_args(['1', '2', '3', '4', '--sum'])1119Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])1120```11211122### Объект Namespace11231124#### `class argparse.Namespace`11251126Простой класс, используемый по умолчанию в [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) для создания объекта, содержащего атрибуты, и его возврата.11271128Этот класс намеренно прост, всего лишь подкласс [`object`](https://python-all.ru/3.12/library/functions.html#object) с читаемым строковым представлением. Если нужно dict-подобное представление атрибутов, можно воспользоваться стандартной идиомой Python, [`vars()`](https://python-all.ru/3.12/library/functions.html#vars):11291130```python1131>>> parser = argparse.ArgumentParser()1132>>> parser.add_argument('--foo')1133>>> args = parser.parse_args(['--foo', 'BAR'])1134>>> vars(args)1135{'foo': 'BAR'}1136```11371138Также может быть полезно, чтобы [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) присваивал атрибуты уже существующему объекту, а не новому объекту [`Namespace`](https://python-all.ru/3.12/library/argparse.html#argparse.Namespace). Этого можно достичь, указав именованный аргумент `namespace=`:11391140```python1141>>> class C:1142... pass1143...1144>>> c = C()1145>>> parser = argparse.ArgumentParser()1146>>> parser.add_argument('--foo')1147>>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)1148>>> c.foo1149'BAR'1150```11511152## Другие утилиты11531154### Подкоманды11551156#### `ArgumentParser.add_subparsers(*[, title][, description][, prog][, parser_class][, action][, dest][, required][, help][, metavar])`11571158Многие программы разделяют свою функциональность на несколько подкоманд; например, программа `svn` может вызывать подкоманды `svn checkout`, `svn update` и `svn commit`. Такое разделение функциональности может быть особенно удачной идеей, когда программа выполняет несколько различных функций, требующих разных видов аргументов командной строки. [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) поддерживает создание таких подкоманд с помощью метода `add_subparsers()`. Метод `add_subparsers()` обычно вызывается без аргументов и возвращает специальный объект действия. Этот объект имеет единственный метод, `add_parser()`, который принимает имя команды и любые аргументы конструктора `ArgumentParser`, и возвращает объект `ArgumentParser`, который можно изменять обычным образом.11591160Описание параметров:11611162- *title* – заголовок для группы подпарсеров в выводе справки; по умолчанию «subcommands», если указано описание, в противном случае используется заголовок для позиционных аргументов1163- *description* – описание для группы подпарсеров в выводе справки; по умолчанию `None`1164- *prog* – информация об использовании, которая будет показана в справке по подкоманде; по умолчанию – имя программы и все позиционные аргументы до аргумента подпарсера1165- *parser\_class* – класс, который будет использоваться для создания экземпляров подпарсеров; по умолчанию – класс текущего парсера (например, [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser))1166- [action](https://python-all.ru/3.12/library/argparse.html#action) – базовый тип действия, которое будет выполнено при обнаружении этого аргумента в командной строке1167- [dest](https://python-all.ru/3.12/library/argparse.html#dest) – имя атрибута, в котором будет сохранено имя подкоманды; по умолчанию `None`, значение не сохраняется1168- [required](https://python-all.ru/3.12/library/argparse.html#required) – указывает, обязательно ли должна быть указана подкоманда; по умолчанию `False` (добавлено в версии 3.7)1169- [help](https://python-all.ru/3.12/library/argparse.html#help) – справка для группы подпарсеров в выводе справки; по умолчанию `None`1170- [metavar](https://python-all.ru/3.12/library/argparse.html#metavar) – строка, представляющая доступные подкоманды в справке; по умолчанию `None`, и подкоманды отображаются в виде {cmd1, cmd2, ..}11711172Пример использования:11731174```python1175>>> # создать парсер верхнего уровня1176>>> parser = argparse.ArgumentParser(prog='PROG')1177>>> parser.add_argument('--foo', action='store_true', help='foo help')1178>>> subparsers = parser.add_subparsers(help='subcommand help')1179>>>1180>>> # создать парсер для команды "a"1181>>> parser_a = subparsers.add_parser('a', help='a help')1182>>> parser_a.add_argument('bar', type=int, help='bar help')1183>>>1184>>> # создать парсер для команды "b"1185>>> parser_b = subparsers.add_parser('b', help='b help')1186>>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help')1187>>>1188>>> # разобрать некоторые списки аргументов1189>>> parser.parse_args(['a', '12'])1190Namespace(bar=12, foo=False)1191>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])1192Namespace(baz='Z', foo=True)1193```11941195Обратите внимание, что объект, возвращаемый [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args), будет содержать только атрибуты главного парсера и того подпарсера, который был выбран из командной строки (а не любых других подпарсеров). Так, в приведённом выше примере, когда указана команда `a`, присутствуют только атрибуты `foo` и `bar`, а когда указана команда `b` – только атрибуты `foo` и `baz`.11961197Аналогично, при запросе справки от подпарсера выводится только справка этого конкретного парсера. Сообщение справки не включает сообщения родительского парсера или соседних парсеров. (Однако справку для каждой команды подпарсера можно задать, передав аргумент `help=` функции `add_parser()`, как показано выше.)11981199```python1200>>> parser.parse_args(['--help'])1201usage: PROG [-h] [--foo] {a,b} ...12021203positional arguments:1204 {a,b} subcommand help1205 a a help1206 b b help12071208options:1209 -h, --help show this help message and exit1210 --foo foo help12111212>>> parser.parse_args(['a', '--help'])1213usage: PROG a [-h] bar12141215positional arguments:1216 bar bar help12171218options:1219 -h, --help show this help message and exit12201221>>> parser.parse_args(['b', '--help'])1222usage: PROG b [-h] [--baz {X,Y,Z}]12231224options:1225 -h, --help show this help message and exit1226 --baz {X,Y,Z} baz help1227```12281229Метод [`add_subparsers()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_subparsers) также поддерживает именованные аргументы `title` и `description`. Когда любой из них присутствует, команды подпарсера отображаются в собственной группе в выводе справки. Например:12301231```python1232>>> parser = argparse.ArgumentParser()1233>>> subparsers = parser.add_subparsers(title='subcommands',1234... description='valid subcommands',1235... help='additional help')1236>>> subparsers.add_parser('foo')1237>>> subparsers.add_parser('bar')1238>>> parser.parse_args(['-h'])1239usage: [-h] {foo,bar} ...12401241options:1242 -h, --help show this help message and exit12431244subcommands:1245 valid subcommands12461247 {foo,bar} additional help1248```12491250Кроме того, `add_parser` поддерживает дополнительный аргумент `aliases`, позволяющий нескольким строкам ссылаться на один и тот же подпарсер. Этот пример, как и `svn`, задаёт псевдоним `co` как сокращение для `checkout`:12511252```python1253>>> parser = argparse.ArgumentParser()1254>>> subparsers = parser.add_subparsers()1255>>> checkout = subparsers.add_parser('checkout', aliases=['co'])1256>>> checkout.add_argument('foo')1257>>> parser.parse_args(['co', 'bar'])1258Namespace(foo='bar')1259```12601261Один из особенно эффективных способов работы с подкомандами – комбинировать использование метода [`add_subparsers()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_subparsers) с вызовами [`set_defaults()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.set_defaults), чтобы каждый подпарсер знал, какую функцию Python он должен выполнить. Например:12621263```python1264>>> # функции подкоманд1265>>> def foo(args):1266... print(args.x * args.y)1267...1268>>> def bar(args):1269... print('((%s))' % args.z)1270...1271>>> # создать парсер верхнего уровня1272>>> parser = argparse.ArgumentParser()1273>>> subparsers = parser.add_subparsers(required=True)1274>>>1275>>> # создать парсер для команды "foo"1276>>> parser_foo = subparsers.add_parser('foo')1277>>> parser_foo.add_argument('-x', type=int, default=1)1278>>> parser_foo.add_argument('y', type=float)1279>>> parser_foo.set_defaults(func=foo)1280>>>1281>>> # создать парсер для команды "bar"1282>>> parser_bar = subparsers.add_parser('bar')1283>>> parser_bar.add_argument('z')1284>>> parser_bar.set_defaults(func=bar)1285>>>1286>>> # разобрать аргументы и вызвать выбранную функцию1287>>> args = parser.parse_args('foo 1 -x 2'.split())1288>>> args.func(args)12892.01290>>>1291>>> # разобрать аргументы и вызвать выбранную функцию1292>>> args = parser.parse_args('bar XYZYX'.split())1293>>> args.func(args)1294((XYZYX))1295```12961297Таким образом, можно поручить [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) задачу вызова соответствующей функции после завершения разбора аргументов. Связывание функций с действиями таким образом – обычно самый простой способ обработать разные действия для каждого из ваших подпарсеров. Однако, если необходимо проверить имя вызванного подпарсера, сработает именованный аргумент `dest` при вызове [`add_subparsers()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_subparsers):12981299```python1300>>> parser = argparse.ArgumentParser()1301>>> subparsers = parser.add_subparsers(dest='subparser_name')1302>>> subparser1 = subparsers.add_parser('1')1303>>> subparser1.add_argument('-x')1304>>> subparser2 = subparsers.add_parser('2')1305>>> subparser2.add_argument('y')1306>>> parser.parse_args(['2', 'frobble'])1307Namespace(subparser_name='2', y='frobble')1308```13091310Изменено в версии 3.7: Новый именованный параметр *required*.13111312### Объекты FileType13131314#### `class argparse.FileType(mode='r', bufsize=-1, encoding=None, errors=None)`13151316Фабрика [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType) создаёт объекты, которые можно передать в аргумент type функции [`ArgumentParser.add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument). Аргументы, имеющие объекты [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType) в качестве типа, будут открывать аргументы командной строки как файлы с указанными режимами, размерами буфера, кодировками и обработкой ошибок (см. функцию [`open()`](https://python-all.ru/3.12/library/functions.html#open) для подробностей):13171318```python1319>>> parser = argparse.ArgumentParser()1320>>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))1321>>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))1322>>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])1323Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)1324```13251326Объекты FileType понимают псевдоаргумент `'-'` и автоматически преобразуют его в [`sys.stdin`](https://python-all.ru/3.12/library/sys.html#sys.stdin) для читаемых объектов [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType) и в [`sys.stdout`](https://python-all.ru/3.12/library/sys.html#sys.stdout) для записываемых объектов [`FileType`](https://python-all.ru/3.12/library/argparse.html#argparse.FileType):13271328```python1329>>> parser = argparse.ArgumentParser()1330>>> parser.add_argument('infile', type=argparse.FileType('r'))1331>>> parser.parse_args(['-'])1332Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)1333```13341335Изменено в версии 3.4: Добавлены параметры *encodings* и *errors*.13361337### Группы аргументов13381339#### `ArgumentParser.add_argument_group(title=None, description=None, *[, argument_default][, conflict_handler])`13401341По умолчанию [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) группирует аргументы командной строки на «позиционные аргументы» и «опции» при отображении сообщений справки. Если существует более осмысленная концептуальная группировка аргументов, чем эта, можно создать соответствующие группы с помощью метода `add_argument_group()`:13421343```python1344>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)1345>>> group = parser.add_argument_group('group')1346>>> group.add_argument('--foo', help='foo help')1347>>> group.add_argument('bar', help='bar help')1348>>> parser.print_help()1349usage: PROG [--foo FOO] bar13501351group:1352 bar bar help1353 --foo FOO foo help1354```13551356Метод [`add_argument_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument_group) возвращает объект группы аргументов, у которого есть метод [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), как и у обычного [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Когда аргумент добавляется в группу, парсер обрабатывает его как обычный аргумент, но при выводе справки отображает его в отдельной группе. Метод `add_argument_group()` принимает аргументы *title* и *description*, которые можно использовать для настройки этого отображения:13571358```python1359>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)1360>>> group1 = parser.add_argument_group('group1', 'group1 description')1361>>> group1.add_argument('foo', help='foo help')1362>>> group2 = parser.add_argument_group('group2', 'group2 description')1363>>> group2.add_argument('--bar', help='bar help')1364>>> parser.print_help()1365usage: PROG [--bar BAR] foo13661367group1:1368 group1 description13691370 foo foo help13711372group2:1373 group2 description13741375 --bar BAR bar help1376```13771378Необязательные именованные параметры [argument\_default](https://python-all.ru/3.12/library/argparse.html#argument-default) и [conflict\_handler](https://python-all.ru/3.12/library/argparse.html#conflict-handler) позволяют более детально управлять поведением группы аргументов. Эти параметры имеют тот же смысл, что и в конструкторе [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser), но применяются именно к группе аргументов, а не ко всему парсеру.13791380Обратите внимание, что любые аргументы, не входящие в ваши пользовательские группы, окажутся обратно в обычных разделах «позиционные аргументы» и «опциональные аргументы».13811382Изменено в версии 3.11: Вызов [`add_argument_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument_group) для группы аргументов устарел. Эта возможность никогда не поддерживалась и не всегда работает корректно. Функция присутствует в API случайно, из-за наследования, и будет удалена в будущем.13831384### Взаимное исключение13851386#### `ArgumentParser.add_mutually_exclusive_group(required=False)`13871388Создаёт взаимоисключающую группу. `argparse` гарантирует, что в командной строке присутствовал только один из аргументов взаимоисключающей группы:13891390```python1391>>> parser = argparse.ArgumentParser(prog='PROG')1392>>> group = parser.add_mutually_exclusive_group()1393>>> group.add_argument('--foo', action='store_true')1394>>> group.add_argument('--bar', action='store_false')1395>>> parser.parse_args(['--foo'])1396Namespace(bar=True, foo=True)1397>>> parser.parse_args(['--bar'])1398Namespace(bar=False, foo=False)1399>>> parser.parse_args(['--foo', '--bar'])1400usage: PROG [-h] [--foo | --bar]1401PROG: error: argument --bar: not allowed with argument --foo1402```14031404Метод [`add_mutually_exclusive_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group) также принимает аргумент *required*, чтобы указать, что требуется хотя бы один из взаимоисключающих аргументов:14051406```python1407>>> parser = argparse.ArgumentParser(prog='PROG')1408>>> group = parser.add_mutually_exclusive_group(required=True)1409>>> group.add_argument('--foo', action='store_true')1410>>> group.add_argument('--bar', action='store_false')1411>>> parser.parse_args([])1412usage: PROG [-h] (--foo | --bar)1413PROG: error: one of the arguments --foo --bar is required1414```14151416Обратите внимание: в настоящее время взаимоисключающие группы аргументов не поддерживают аргументы *title* и *description* метода [`add_argument_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument_group). Однако взаимоисключающую группу можно добавить к группе аргументов, у которой есть заголовок и описание. Например:14171418```python1419>>> parser = argparse.ArgumentParser(prog='PROG')1420>>> group = parser.add_argument_group('Group title', 'Group description')1421>>> exclusive_group = group.add_mutually_exclusive_group(required=True)1422>>> exclusive_group.add_argument('--foo', help='foo help')1423>>> exclusive_group.add_argument('--bar', help='bar help')1424>>> parser.print_help()1425usage: PROG [-h] (--foo FOO | --bar BAR)14261427options:1428 -h, --help show this help message and exit14291430Group title:1431 Group description14321433 --foo FOO foo help1434 --bar BAR bar help1435```14361437Изменено в версии 3.11: Вызов [`add_argument_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument_group) или [`add_mutually_exclusive_group()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group) для взаимоисключающей группы устарел. Эти возможности никогда не поддерживались и не всегда работают корректно. Функции присутствуют в API случайно, из-за наследования, и будут удалены в будущем.14381439### Умолчания парсера14401441#### `ArgumentParser.set_defaults(**kwargs)`14421443В большинстве случаев атрибуты объекта, возвращаемого [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args), полностью определяются путём анализа аргументов командной строки и действий аргументов. [`set_defaults()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.set_defaults) позволяет добавить некоторые дополнительные атрибуты, которые определяются без какого-либо анализа командной строки:14441445```python1446>>> parser = argparse.ArgumentParser()1447>>> parser.add_argument('foo', type=int)1448>>> parser.set_defaults(bar=42, baz='badger')1449>>> parser.parse_args(['736'])1450Namespace(bar=42, baz='badger', foo=736)1451```14521453Обратите внимание: значения по умолчанию на уровне анализатора всегда переопределяют значения по умолчанию на уровне аргументов:14541455```python1456>>> parser = argparse.ArgumentParser()1457>>> parser.add_argument('--foo', default='bar')1458>>> parser.set_defaults(foo='spam')1459>>> parser.parse_args([])1460Namespace(foo='spam')1461```14621463Умолчания на уровне парсера могут быть особенно полезны при работе с несколькими парсерами. См. пример этого типа в методе [`add_subparsers()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_subparsers).14641465#### `ArgumentParser.get_default(dest)`14661467Возвращает значение по умолчанию для атрибута пространства имён, заданное либо [`add_argument()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.add_argument), либо [`set_defaults()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.set_defaults):14681469```python1470>>> parser = argparse.ArgumentParser()1471>>> parser.add_argument('--foo', default='badger')1472>>> parser.get_default('foo')1473'badger'1474```14751476### Вывод справки14771478В большинстве типичных приложений [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args) берёт на себя форматирование и вывод всех сообщений об использовании и ошибок. Однако доступно несколько методов форматирования:14791480#### `ArgumentParser.print_usage(file=None)`14811482Выводит краткое описание того, как [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) должен вызываться в командной строке. Если *file* равен `None`, предполагается [`sys.stdout`](https://python-all.ru/3.12/library/sys.html#sys.stdout).14831484#### `ArgumentParser.print_help(file=None)`14851486Выводит справочное сообщение, включая использование программы и информацию об аргументах, зарегистрированных в [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser). Если *file* равен `None`, предполагается [`sys.stdout`](https://python-all.ru/3.12/library/sys.html#sys.stdout).14871488Существуют также варианты этих методов, которые просто возвращают строку вместо её вывода:14891490#### `ArgumentParser.format_usage()`14911492Возвращает строку с кратким описанием того, как [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser) должен вызываться в командной строке.14931494#### `ArgumentParser.format_help()`14951496Возвращает строку со справочным сообщением, включая использование программы и информацию об аргументах, зарегистрированных в [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser).14971498### Частичный разбор14991500#### `ArgumentParser.parse_known_args(args=None, namespace=None)`15011502Иногда скрипт может разобрать только часть аргументов командной строки, передавая остальные другому скрипту или программе. В таких случаях может пригодиться метод [`parse_known_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_known_args). Он работает почти как [`parse_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_args), за исключением того, что не вызывает ошибку при наличии лишних аргументов. Вместо этого он возвращает кортеж из двух элементов: заполненное пространство имён и список оставшихся строк аргументов.15031504```python1505>>> parser = argparse.ArgumentParser()1506>>> parser.add_argument('--foo', action='store_true')1507>>> parser.add_argument('bar')1508>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])1509(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])1510```15111512> **Предупреждение**1513>1514> Правила [совпадения по префиксу](https://python-all.ru/3.12/library/argparse.html#prefix-matching) применяются к [`parse_known_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_known_args). Парсер может поглотить параметр, даже если он является всего лишь префиксом одного из известных параметров, вместо того чтобы оставить его в списке оставшихся аргументов.15151516### Настройка разбора файлов15171518#### `ArgumentParser.convert_arg_line_to_args(arg_line)`15191520Аргументы, читаемые из файла (см. именованный аргумент *fromfile\_prefix\_chars* конструктора [`ArgumentParser`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser)), читаются по одному аргументу на строку. [`convert_arg_line_to_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args) можно переопределить для более сложного чтения.15211522Этот метод принимает один аргумент *arg\_line* – строку, прочитанную из файла аргументов. Он возвращает список аргументов, разобранных из этой строки. Метод вызывается по одному разу для каждой строки из файла аргументов, по порядку.15231524Полезным переопределением этого метода будет то, которое рассматривает каждое отделённое пробелом слово как аргумент. Следующий пример показывает, как это сделать:15251526```python1527class MyArgumentParser(argparse.ArgumentParser):1528 def convert_arg_line_to_args(self, arg_line):1529 return arg_line.split()1530```15311532### Методы завершения15331534#### `ArgumentParser.exit(status=0, message=None)`15351536Этот метод завершает программу с указанным *status* и, если задано, выводит *message* в [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr) перед этим. Пользователь может переопределить этот метод, чтобы выполнять эти действия иначе:15371538```python1539class ErrorCatchingArgumentParser(argparse.ArgumentParser):1540 def exit(self, status=0, message=None):1541 if status:1542 raise Exception(f'Exiting because of an error: {message}')1543 exit(status)1544```15451546#### `ArgumentParser.error(message)`15471548Этот метод выводит сообщение об использовании, включая *message*, в [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr) и завершает программу с кодом возврата 2.15491550### Смешанный разбор15511552#### `ArgumentParser.parse_intermixed_args(args=None, namespace=None)`15531554#### `ArgumentParser.parse_known_intermixed_args(args=None, namespace=None)`15551556Многие команды Unix позволяют пользователю смешивать опциональные аргументы с позиционными. Методы [`parse_intermixed_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_intermixed_args) и [`parse_known_intermixed_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_known_intermixed_args) поддерживают такой стиль разбора.15571558Эти анализаторы не поддерживают все возможности `argparse` и будут вызывать исключения при использовании неподдерживаемых возможностей. В частности, не поддерживаются подпарсеры и взаимоисключающие группы, содержащие как опциональные, так и позиционные аргументы.15591560Следующий пример показывает разницу между [`parse_known_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_known_args) и [`parse_intermixed_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_intermixed_args): первый возвращает `['2', '3']` как неразобранные аргументы, в то время как второй собирает все позиционные аргументы в `rest`.15611562```python1563>>> parser = argparse.ArgumentParser()1564>>> parser.add_argument('--foo')1565>>> parser.add_argument('cmd')1566>>> parser.add_argument('rest', nargs='*', type=int)1567>>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())1568(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])1569>>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())1570Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])1571```15721573[`parse_known_intermixed_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_known_intermixed_args) возвращает кортеж из двух элементов, содержащий заполненное пространство имён и список оставшихся строк аргументов. [`parse_intermixed_args()`](https://python-all.ru/3.12/library/argparse.html#argparse.ArgumentParser.parse_intermixed_args) вызывает ошибку, если остаются какие-либо неразобранные строки аргументов.15741575Добавлено в версии 3.7.15761577### Регистрация пользовательских типов или действий15781579#### `ArgumentParser.register(registry_name, value, object)`15801581Иногда бывает удобно использовать произвольную строку в сообщениях об ошибках, чтобы сделать вывод более понятным для пользователя. В таких случаях `register()` можно использовать для регистрации пользовательских действий или типов в анализаторе и ссылаться на тип по его зарегистрированному имени, а не по имени вызываемого объекта.15821583Метод `register()` принимает три аргумента: *registry\_name*, указывающий внутренний реестр, в котором будет сохранён объект (например, `action`, `type`); *value* – ключ, под которым объект будет зарегистрирован; и object – вызываемый объект, который нужно зарегистрировать.15841585Следующий пример показывает, как зарегистрировать пользовательский тип в анализаторе:15861587```python1588>>> import argparse1589>>> parser = argparse.ArgumentParser()1590>>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16))1591>>> parser.add_argument('--foo', type='hexadecimal integer')1592_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False)1593>>> parser.parse_args(['--foo', '0xFA'])1594Namespace(foo=250)1595>>> parser.parse_args(['--foo', '1.2'])1596usage: PROG [-h] [--foo FOO]1597PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'1598```15991600## Исключения16011602#### `exception argparse.ArgumentError`16031604Ошибка при создании или использовании аргумента (опционального или позиционного).16051606Строковое значение этого исключения – это сообщение, дополненное информацией об аргументе, который его вызвал.16071608#### `exception argparse.ArgumentTypeError`16091610Вызывается, когда что-то идёт не так при преобразовании строки командной строки в тип.16111612Руководства и учебные пособия16131614- [Учебное пособие по argparse](https://python-all.ru/3.12/howto/argparse.html)1615- [Обновление кода optparse](https://python-all.ru/3.12/howto/argparse-optparse.html)1616