argparse.md
1> **Источник:** https://python-all.ru/3.14/howto/argparse.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Руководство по Argparse89**автор:**1011Tshepang Mbambo1213Это руководство задумано как мягкое введение в [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse), рекомендуемый модуль для разбора командной строки в стандартной библиотеке Python.1415> **Примечание**16>17> В стандартную библиотеку входят ещё два модуля, напрямую связанных с обработкой параметров командной строки: модуль [`optparse`](https://python-all.ru/3.14/library/optparse.html#module-optparse) более низкого уровня (для настройки приложения может потребоваться больше кода, но он позволяет запрашивать поведение, не поддерживаемое `argparse`) и модуль очень низкого уровня [`getopt`](https://python-all.ru/3.14/library/getopt.html#module-getopt) (который служит аналогом семейства функций `getopt()` для программ на C). Хотя ни один из этих модулей напрямую не рассматривается в этом руководстве, многие ключевые концепции `argparse` изначально появились в `optparse`, поэтому некоторые аспекты этого руководства будут полезны и пользователям `optparse`.1819## Основные понятия2021Давайте покажем, какие возможности мы будем изучать в этом вводном руководстве, на примере команды **ls**:2223```console24$ ls25cpython devguide prog.py pypy rm-unused-function.patch26$ ls pypy27ctypes_configure demo dotviewer include lib_pypy lib-python ...28$ ls -l29total 2030drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython31drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide32-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py33drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy34-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch35$ ls --help36Usage: ls [OPTION]... [FILE]...37List information about the FILEs (the current directory by default).38Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.39...40```4142Из этих четырёх команд можно извлечь несколько понятий:4344- Команда **ls** полезна при запуске без каких-либо опций. По умолчанию она выводит содержимое текущего каталога.45- Если нужно больше, чем даётся по умолчанию, мы сообщаем программе дополнительные сведения. В данном случае мы хотим показать другой каталог – `pypy`. Мы указали так называемый позиционный аргумент. Он назван так потому, что программа понимает, что делать со значением, только по его позиции в командной строке. Это понятие лучше видно на примере команды **cp**, простейшее использование которой – `cp SRC DEST`. Первая позиция – *что нужно скопировать*, а вторая – *куда скопировать*.46- Теперь представим, что мы хотим изменить поведение программы. В нашем примере мы выводим больше информации о каждом файле, а не только имена. `-l` в этом случае называется необязательным аргументом.47- Это фрагмент справки. Она очень полезна: вы можете встретить незнакомую программу и понять, как она работает, просто прочитав её справку.4849## Основы5051Начнём с очень простого примера, который (почти) ничего не делает:5253```python54import argparse55parser = argparse.ArgumentParser()56parser.parse_args()57```5859Ниже приведён результат выполнения кода:6061```console62$ python prog.py63$ python prog.py --help64usage: prog.py [-h]6566options:67 -h, --help show this help message and exit68$ python prog.py --verbose69usage: prog.py [-h]70prog.py: error: unrecognized arguments: --verbose71$ python prog.py foo72usage: prog.py [-h]73prog.py: error: unrecognized arguments: foo74```7576Вот что происходит:7778- Запуск скрипта без опций не выводит ничего в stdout. Не очень полезно.79- Второй запуск начинает показывать полезность модуля [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse). Мы почти ничего не сделали, но уже получили хорошее сообщение справки.80- Опция `--help`, которую можно сократить до `-h`, – единственная опция, которую мы получаем бесплатно (т.е. её не нужно указывать). Всё остальное приводит к ошибке. Но даже в этом случае мы получаем полезное сообщение об использовании – тоже бесплатно.8182## Знакомство с позиционными аргументами8384Пример:8586```python87import argparse88parser = argparse.ArgumentParser()89parser.add_argument("echo")90args = parser.parse_args()91print(args.echo)92```9394И запуск кода:9596```console97$ python prog.py98usage: prog.py [-h] echo99prog.py: error: the following arguments are required: echo100$ python prog.py --help101usage: prog.py [-h] echo102103positional arguments:104 echo105106options:107 -h, --help show this help message and exit108$ python prog.py foo109foo110```111112Вот что происходит:113114- Мы добавили метод [`add_argument()`](https://python-all.ru/3.14/library/argparse.html#argparse.ArgumentParser.add_argument), который используется для указания опций командной строки, которые программа готова принять. В данном случае я назвал его `echo`, чтобы оно соответствовало своей функции.115- Теперь для вызова программы требуется указать опцию.116- Метод [`parse_args()`](https://python-all.ru/3.14/library/argparse.html#argparse.ArgumentParser.parse_args) на самом деле возвращает некоторые данные из указанных опций, в данном случае `echo`.117- Переменная – это своего рода «магия», которую [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) выполняет бесплатно (т.е. не нужно указывать, в какой переменной хранится это значение). Вы также заметите, что её имя совпадает со строковым аргументом, переданным методу – `echo`.118119Однако обратите внимание, что, хотя справка выглядит красиво, пока она не так полезна, как могла бы быть. Например, мы видим, что у нас есть позиционный аргумент `echo`, но не знаем, что он делает – только догадываемся или читаем исходный код. Давайте сделаем его немного полезнее:120121```python122import argparse123parser = argparse.ArgumentParser()124parser.add_argument("echo", help="echo the string you use here")125args = parser.parse_args()126print(args.echo)127```128129И получаем:130131```console132$ python prog.py -h133usage: prog.py [-h] echo134135positional arguments:136 echo echo the string you use here137138options:139 -h, --help show this help message and exit140```141142А теперь давайте сделаем что-нибудь ещё более полезное:143144```python145import argparse146parser = argparse.ArgumentParser()147parser.add_argument("square", help="display a square of a given number")148args = parser.parse_args()149print(args.square**2)150```151152Ниже приведён результат выполнения кода:153154```console155$ python prog.py 4156Traceback (most recent call last):157 File "prog.py", line 5, in <module>158 print(args.square**2)159TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'160```161162Всё пошло не так. Это потому, что [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) воспринимает переданные ему параметры как строки, если не указать иное. Итак, укажем `argparse` воспринимать ввод как целое число:163164```python165import argparse166parser = argparse.ArgumentParser()167parser.add_argument("square", help="display a square of a given number",168 type=int)169args = parser.parse_args()170print(args.square**2)171```172173Ниже приведён результат выполнения кода:174175```console176$ python prog.py 417716178$ python prog.py four179usage: prog.py [-h] square180prog.py: error: argument square: invalid int value: 'four'181```182183Всё прошло хорошо. Программа теперь даже корректно завершается при неверном вводе перед продолжением.184185## Знакомство с необязательными аргументами186187До сих пор мы работали с позиционными аргументами. Давайте посмотрим, как добавить необязательные.188189```python190import argparse191parser = argparse.ArgumentParser()192parser.add_argument("--verbosity", help="increase output verbosity")193args = parser.parse_args()194if args.verbosity:195 print("verbosity turned on")196```197198И вывод:199200```console201$ python prog.py --verbosity 1202verbosity turned on203$ python prog.py204$ python prog.py --help205usage: prog.py [-h] [--verbosity VERBOSITY]206207options:208 -h, --help show this help message and exit209 --verbosity VERBOSITY210 increase output verbosity211$ python prog.py --verbosity212usage: prog.py [-h] [--verbosity VERBOSITY]213prog.py: error: argument --verbosity: expected one argument214```215216Вот что происходит:217218- Программа написана так, чтобы выводить что-то, когда указан `--verbosity`, и ничего не выводить, если не указан.219- Чтобы показать, что опция действительно необязательна, при запуске программы без неё ошибки не возникает. Обратите внимание: по умолчанию, если необязательный аргумент не указан, соответствующая переменная (в данном случае `args.verbosity`) получает значение `None`, из-за чего она не проходит проверку на истинность в операторе [`if`](https://python-all.ru/3.14/reference/compound_stmts.html#if).220- Справочное сообщение немного отличается.221- При использовании опции `--verbosity` необходимо также указать некоторое значение, любое значение.222223В приведённом выше примере `--verbosity` принимает любые целые числа, но для нашей простой программы на самом деле полезны только два значения: `True` или `False`. Давайте соответствующим образом изменим код:224225```python226import argparse227parser = argparse.ArgumentParser()228parser.add_argument("--verbose", help="increase output verbosity",229 action="store_true")230args = parser.parse_args()231if args.verbose:232 print("verbosity turned on")233```234235И вывод:236237```console238$ python prog.py --verbose239verbosity turned on240$ python prog.py --verbose 1241usage: prog.py [-h] [--verbose]242prog.py: error: unrecognized arguments: 1243$ python prog.py --help244usage: prog.py [-h] [--verbose]245246options:247 -h, --help show this help message and exit248 --verbose increase output verbosity249```250251Вот что происходит:252253- Теперь опция больше напоминает флаг, нежели что-то, требующее значения. Мы даже изменили имя опции в соответствии с этой идеей. Обратите внимание: теперь мы указываем новый ключевой аргумент `action` и присваиваем ему значение `"store_true"`. Это означает, что если опция указана, то `args.verbose` присваивается значение `True`. Если не указана – то `False`.254- Программа выдаёт ошибку, если указано значение, в полном соответствии с тем, что такое флаги на самом деле.255- Обратите внимание на другой текст справки.256257### Короткие опции258259Если вы знакомы с работой из командной строки, то заметили, что я ещё не касался темы коротких версий опций. Всё довольно просто:260261```python262import argparse263parser = argparse.ArgumentParser()264parser.add_argument("-v", "--verbose", help="increase output verbosity",265 action="store_true")266args = parser.parse_args()267if args.verbose:268 print("verbosity turned on")269```270271И вот:272273```console274$ python prog.py -v275verbosity turned on276$ python prog.py --help277usage: prog.py [-h] [-v]278279options:280 -h, --help show this help message and exit281 -v, --verbose increase output verbosity282```283284Обратите внимание, что новая возможность также отражена в справочном тексте.285286## Сочетание позиционных и необязательных аргументов287288Наша программа становится всё сложнее:289290```python291import argparse292parser = argparse.ArgumentParser()293parser.add_argument("square", type=int,294 help="display a square of a given number")295parser.add_argument("-v", "--verbose", action="store_true",296 help="increase output verbosity")297args = parser.parse_args()298answer = args.square**2299if args.verbose:300 print(f"the square of {args.square} equals {answer}")301else:302 print(answer)303```304305А теперь вывод:306307```console308$ python prog.py309usage: prog.py [-h] [-v] square310prog.py: error: the following arguments are required: square311$ python prog.py 431216313$ python prog.py 4 --verbose314the square of 4 equals 16315$ python prog.py --verbose 4316the square of 4 equals 16317```318319- Мы вернули позиционный аргумент, отсюда и жалоба.320- Обратите внимание: порядок не важен.321322А что, если вернуть нашей программе возможность иметь несколько значений уровня подробности вывода и на самом деле их использовать:323324```python325import argparse326parser = argparse.ArgumentParser()327parser.add_argument("square", type=int,328 help="display a square of a given number")329parser.add_argument("-v", "--verbosity", type=int,330 help="increase output verbosity")331args = parser.parse_args()332answer = args.square**2333if args.verbosity == 2:334 print(f"the square of {args.square} equals {answer}")335elif args.verbosity == 1:336 print(f"{args.square}^2 == {answer}")337else:338 print(answer)339```340341И вывод:342343```console344$ python prog.py 434516346$ python prog.py 4 -v347usage: prog.py [-h] [-v VERBOSITY] square348prog.py: error: argument -v/--verbosity: expected one argument349$ python prog.py 4 -v 13504^2 == 16351$ python prog.py 4 -v 2352the square of 4 equals 16353$ python prog.py 4 -v 335416355```356357Все они выглядят хорошо, кроме последнего, который выявляет ошибку в нашей программе. Давайте исправим её, ограничив значения, которые может принимать опция `--verbosity`:358359```python360import argparse361parser = argparse.ArgumentParser()362parser.add_argument("square", type=int,363 help="display a square of a given number")364parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],365 help="increase output verbosity")366args = parser.parse_args()367answer = args.square**2368if args.verbosity == 2:369 print(f"the square of {args.square} equals {answer}")370elif args.verbosity == 1:371 print(f"{args.square}^2 == {answer}")372else:373 print(answer)374```375376И вывод:377378```console379$ python prog.py 4 -v 3380usage: prog.py [-h] [-v {0,1,2}] square381prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)382$ python prog.py 4 -h383usage: prog.py [-h] [-v {0,1,2}] square384385positional arguments:386 square display a square of a given number387388options:389 -h, --help show this help message and exit390 -v, --verbosity {0,1,2}391 increase output verbosity392```393394Обратите внимание: изменение также отражается как в сообщении об ошибке, так и в строке справки.395396Теперь давайте применим другой подход к работе с подробностью вывода, который довольно распространён. Он также соответствует тому, как исполняемый файл CPython обрабатывает собственный аргумент подробности (проверьте вывод `python --help`):397398```python399import argparse400parser = argparse.ArgumentParser()401parser.add_argument("square", type=int,402 help="display the square of a given number")403parser.add_argument("-v", "--verbosity", action="count",404 help="increase output verbosity")405args = parser.parse_args()406answer = args.square**2407if args.verbosity == 2:408 print(f"the square of {args.square} equals {answer}")409elif args.verbosity == 1:410 print(f"{args.square}^2 == {answer}")411else:412 print(answer)413```414415Мы ввели ещё одно действие – «count», которое подсчитывает количество вхождений определённых опций.416417```console418$ python prog.py 441916420$ python prog.py 4 -v4214^2 == 16422$ python prog.py 4 -vv423the square of 4 equals 16424$ python prog.py 4 --verbosity --verbosity425the square of 4 equals 16426$ python prog.py 4 -v 1427usage: prog.py [-h] [-v] square428prog.py: error: unrecognized arguments: 1429$ python prog.py 4 -h430usage: prog.py [-h] [-v] square431432positional arguments:433 square display a square of a given number434435options:436 -h, --help show this help message and exit437 -v, --verbosity increase output verbosity438$ python prog.py 4 -vvv43916440```441442- Да, теперь это больше похоже на флаг (аналогично `action="store_true"` в предыдущей версии нашего скрипта). Этим и объясняется жалоба.443- Кроме того, оно ведёт себя аналогично действию «store\_true».444- А вот демонстрация того, что даёт действие «count». Вы, вероятно, уже встречали подобное использование.445- А если не указывать флаг `-v`, считается, что этот флаг имеет значение `None`.446- Как и следовало ожидать, при указании длинной формы флага мы получим тот же результат.447- К сожалению, наш вывод справки не очень информативен о новых возможностях скрипта, но это всегда можно исправить, улучшив документацию (например, через именованный аргумент `help`).448- Последний вывод обнаруживает ошибку в нашей программе.449450Исправим:451452```python453import argparse454parser = argparse.ArgumentParser()455parser.add_argument("square", type=int,456 help="display a square of a given number")457parser.add_argument("-v", "--verbosity", action="count",458 help="increase output verbosity")459args = parser.parse_args()460answer = args.square**2461462# исправление ошибки: заменить == на >=463if args.verbosity >= 2:464 print(f"the square of {args.square} equals {answer}")465elif args.verbosity >= 1:466 print(f"{args.square}^2 == {answer}")467else:468 print(answer)469```470471И вот что получается:472473```console474$ python prog.py 4 -vvv475the square of 4 equals 16476$ python prog.py 4 -vvvv477the square of 4 equals 16478$ python prog.py 4479Traceback (most recent call last):480 File "prog.py", line 11, in <module>481 if args.verbosity >= 2:482TypeError: '>=' not supported between instances of 'NoneType' and 'int'483```484485- Первый вывод прошёл хорошо и исправляет предыдущую ошибку. То есть мы хотим, чтобы любое значение \>= 2 давало максимально подробный вывод.486- Третий вывод уже не так хорош.487488Исправим и эту ошибку:489490```python491import argparse492parser = argparse.ArgumentParser()493parser.add_argument("square", type=int,494 help="display a square of a given number")495parser.add_argument("-v", "--verbosity", action="count", default=0,496 help="increase output verbosity")497args = parser.parse_args()498answer = args.square**2499if args.verbosity >= 2:500 print(f"the square of {args.square} equals {answer}")501elif args.verbosity >= 1:502 print(f"{args.square}^2 == {answer}")503else:504 print(answer)505```506507Мы только что ввели ещё один именованный аргумент – `default`. Мы установили его в `0`, чтобы можно было сравнивать с другими целочисленными значениями. Помните: по умолчанию, если необязательный аргумент не указан, он получает значение `None`, и такое значение нельзя сравнить с целым числом (отсюда исключение [`TypeError`](https://python-all.ru/3.14/library/exceptions.html#TypeError)).508509И:510511```console512$ python prog.py 451316514```515516Уже с тем, что мы узнали, можно уйти довольно далеко, а мы только коснулись поверхности. Модуль [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) очень мощный, и мы рассмотрим его чуть подробнее, прежде чем завершить этот учебник.517518## Немного более продвинутый материал519520Что, если бы мы захотели расширить нашу крошечную программу, чтобы она вычисляла не только квадраты, но и другие степени:521522```python523import argparse524parser = argparse.ArgumentParser()525parser.add_argument("x", type=int, help="the base")526parser.add_argument("y", type=int, help="the exponent")527parser.add_argument("-v", "--verbosity", action="count", default=0)528args = parser.parse_args()529answer = args.x**args.y530if args.verbosity >= 2:531 print(f"{args.x} to the power {args.y} equals {answer}")532elif args.verbosity >= 1:533 print(f"{args.x}^{args.y} == {answer}")534else:535 print(answer)536```537538Вывод:539540```console541$ python prog.py542usage: prog.py [-h] [-v] x y543prog.py: error: the following arguments are required: x, y544$ python prog.py -h545usage: prog.py [-h] [-v] x y546547positional arguments:548 x the base549 y the exponent550551options:552 -h, --help show this help message and exit553 -v, --verbosity554$ python prog.py 4 2 -v5554^2 == 16556```557558Обратите внимание: до сих пор мы использовали уровень подробности, чтобы *изменять* выводимый текст. В следующем примере уровень подробности используется, чтобы выводить *больше* текста:559560```python561import argparse562parser = argparse.ArgumentParser()563parser.add_argument("x", type=int, help="the base")564parser.add_argument("y", type=int, help="the exponent")565parser.add_argument("-v", "--verbosity", action="count", default=0)566args = parser.parse_args()567answer = args.x**args.y568if args.verbosity >= 2:569 print(f"Running '{__file__}'")570if args.verbosity >= 1:571 print(f"{args.x}^{args.y} == ", end="")572print(answer)573```574575Вывод:576577```console578$ python prog.py 4 257916580$ python prog.py 4 2 -v5814^2 == 16582$ python prog.py 4 2 -vv583Running 'prog.py'5844^2 == 16585```586587### Указание неоднозначных аргументов588589Когда есть неоднозначность в определении того, является ли аргумент позиционным или относится к другому аргументу, можно использовать `--`, чтобы указать [`parse_args()`](https://python-all.ru/3.14/library/argparse.html#argparse.ArgumentParser.parse_args), что всё после него – позиционные аргументы:590591```python592>>> parser = argparse.ArgumentParser(prog='PROG')593>>> parser.add_argument('-n', nargs='+')594>>> parser.add_argument('args', nargs='*')595596>>> # неоднозначно, поэтому parse_args считает это опцией597>>> parser.parse_args(['-f'])598usage: PROG [-h] [-n N [N ...]] [args ...]599PROG: error: unrecognized arguments: -f600601>>> parser.parse_args(['--', '-f'])602Namespace(args=['-f'], n=None)603604>>> # неоднозначно, поэтому опция -n жадно принимает аргументы605>>> parser.parse_args(['-n', '1', '2', '3'])606Namespace(args=[], n=['1', '2', '3'])607608>>> parser.parse_args(['-n', '1', '--', '2', '3'])609Namespace(args=['2', '3'], n=['1'])610```611612### Конфликтующие опции613614До сих пор мы работали с двумя методами экземпляра [`argparse.ArgumentParser`](https://python-all.ru/3.14/library/argparse.html#argparse.ArgumentParser). Познакомимся с третьим – [`add_mutually_exclusive_group()`](https://python-all.ru/3.14/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group). Он позволяет указывать опции, которые противоречат друг другу. Давайте также изменим остальную часть программы, чтобы новая функциональность стала более осмысленной: мы введём опцию `--quiet`, которая будет противоположностью опции `--verbose`:615616```python617import argparse618619parser = argparse.ArgumentParser()620group = parser.add_mutually_exclusive_group()621group.add_argument("-v", "--verbose", action="store_true")622group.add_argument("-q", "--quiet", action="store_true")623parser.add_argument("x", type=int, help="the base")624parser.add_argument("y", type=int, help="the exponent")625args = parser.parse_args()626answer = args.x**args.y627628if args.quiet:629 print(answer)630elif args.verbose:631 print(f"{args.x} to the power {args.y} equals {answer}")632else:633 print(f"{args.x}^{args.y} == {answer}")634```635636Наша программа теперь проще, и ради демонстрации мы потеряли часть функциональности. В любом случае, вот вывод:637638```console639$ python prog.py 4 26404^2 == 16641$ python prog.py 4 2 -q64216643$ python prog.py 4 2 -v6444 to the power 2 equals 16645$ python prog.py 4 2 -vq646usage: prog.py [-h] [-v | -q] x y647prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose648$ python prog.py 4 2 -v --quiet649usage: prog.py [-h] [-v | -q] x y650prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose651```652653Это должно быть легко понять. Я добавил последний вывод, чтобы вы могли увидеть, какую гибкость это даёт: например, смешивание длинной и короткой форм опций.654655Прежде чем закончить, вы, вероятно, захотите сообщить пользователям основное назначение вашей программы, на случай если они не знают:656657```python658import argparse659660parser = argparse.ArgumentParser(description="calculate X to the power of Y")661group = parser.add_mutually_exclusive_group()662group.add_argument("-v", "--verbose", action="store_true")663group.add_argument("-q", "--quiet", action="store_true")664parser.add_argument("x", type=int, help="the base")665parser.add_argument("y", type=int, help="the exponent")666args = parser.parse_args()667answer = args.x**args.y668669if args.quiet:670 print(answer)671elif args.verbose:672 print(f"{args.x} to the power {args.y} equals {answer}")673else:674 print(f"{args.x}^{args.y} == {answer}")675```676677Обратите внимание на небольшое различие в тексте использования. Обратите внимание на `[-v | -q]`, который сообщает, что мы можем использовать либо `-v`, либо `-q`, но не оба одновременно:678679```console680$ python prog.py --help681usage: prog.py [-h] [-v | -q] x y682683calculate X to the power of Y684685positional arguments:686 x the base687 y the exponent688689options:690 -h, --help show this help message and exit691 -v, --verbose692 -q, --quiet693```694695## Как перевести вывод argparse696697Вывод модуля [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse), такой как текст справки и сообщения об ошибках, можно сделать переводимым с помощью модуля [`gettext`](https://python-all.ru/3.14/library/gettext.html#module-gettext). Это позволяет приложениям легко локализовать сообщения, создаваемые `argparse`. См. также [Интернационализация ваших программ и модулей](https://python-all.ru/3.14/library/gettext.html#i18n-howto).698699Например, в этом выводе [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse):700701```console702$ python prog.py --help703usage: prog.py [-h] [-v | -q] x y704705calculate X to the power of Y706707positional arguments:708 x the base709 y the exponent710711options:712 -h, --help show this help message and exit713 -v, --verbose714 -q, --quiet715```716717Строки `usage:`, `positional arguments:`, `options:` и `show this help message and exit` – все переводимы.718719Чтобы перевести эти строки, их сначала нужно извлечь в файл `.po`. Например, с помощью [Babel](https://python-all.ru/3.14/howto/argparse.html) выполните следующую команду:720721```console722$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py723```724725Эта команда извлекает все переводимые строки из модуля [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) и выводит их в файл с именем `messages.po`. Команда предполагает, что ваша установка Python находится в `/usr/lib`.726727Узнать расположение модуля [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) в вашей системе можно с помощью следующего скрипта:728729```python730import argparse731print(argparse.__file__)732```733734После того как сообщения в файле `.po` будут переведены и переводы установлены с помощью [`gettext`](https://python-all.ru/3.14/library/gettext.html#module-gettext), [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) сможет отображать переведённые сообщения.735736Чтобы перевести собственные строки в выводе [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse), используйте [`gettext`](https://python-all.ru/3.14/library/gettext.html#module-gettext).737738## Пользовательские преобразователи типов739740Модуль [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) позволяет указать пользовательские преобразователи типов для аргументов командной строки. Это даёт возможность изменять ввод пользователя до того, как он будет сохранён в [`argparse.Namespace`](https://python-all.ru/3.14/library/argparse.html#argparse.Namespace). Это может быть полезно, когда необходимо предварительно обработать ввод перед его использованием в программе.741742При использовании пользовательского преобразователя типов можно применять любой вызываемый объект, который принимает один строковый аргумент (значение аргумента) и возвращает преобразованное значение. Однако если нужно обрабатывать более сложные сценарии, можно использовать пользовательский класс действия с параметром **action**.743744Например, предположим, что нужно обрабатывать аргументы с разными префиксами и соответствующим образом их обрабатывать:745746```python747import argparse748749parser = argparse.ArgumentParser(prefix_chars='-+')750751parser.add_argument('-a', metavar='<value>', action='append',752 type=lambda x: ('-', x))753parser.add_argument('+a', metavar='<value>', action='append',754 type=lambda x: ('+', x))755756args = parser.parse_args()757print(args)758```759760Вывод:761762```console763$ python prog.py -a value1 +a value2764Namespace(a=[('-', 'value1'), ('+', 'value2')])765```766767В этом примере мы:768769- Создали синтаксический анализатор с пользовательскими символами префиксов, используя параметр `prefix_chars`.770- Определили два аргумента, `-a` и `+a`, которые использовали параметр `type` для создания пользовательских преобразователей типов, чтобы сохранить значение в кортеже с префиксом.771772Без пользовательских преобразователей типов аргументы рассматривали бы `-a` и `+a` как один и тот же аргумент, что было бы нежелательно. Используя пользовательские преобразователи типов, мы смогли различать эти два аргумента.773774## Заключение775776Модуль [`argparse`](https://python-all.ru/3.14/library/argparse.html#module-argparse) предлагает гораздо больше, чем показано здесь. Его документация весьма подробна и обстоятельна, полна примеров. Пройдя этот учебник, вы легко сможете её усвоить, не чувствуя перегрузки.777