Документация Python неофициальный перевод

argparse.md

773 строк · 37.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.15/howto/argparse.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Руководство по Argparse89Это руководство задумано как мягкое введение в [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse), рекомендуемый модуль для разбора командной строки в стандартной библиотеке Python.1011> **Примечание**12>13> В стандартную библиотеку входят ещё два модуля, напрямую связанных с обработкой параметров командной строки: модуль [`optparse`](https://python-all.ru/3.15/library/optparse.html#module-optparse) более низкого уровня (для настройки приложения может потребоваться больше кода, но он позволяет запрашивать поведение, не поддерживаемое `argparse`) и модуль очень низкого уровня [`getopt`](https://python-all.ru/3.15/library/getopt.html#module-getopt) (который служит аналогом семейства функций `getopt()` для программ на C). Хотя ни один из этих модулей напрямую не рассматривается в этом руководстве, многие ключевые концепции `argparse` изначально появились в `optparse`, поэтому некоторые аспекты этого руководства будут полезны и пользователям `optparse`.1415## Основные понятия1617Давайте покажем, какие возможности мы будем изучать в этом вводном руководстве, на примере команды **ls**:1819```console20$ ls21cpython  devguide  prog.py  pypy  rm-unused-function.patch22$ ls pypy23ctypes_configure  demo  dotviewer  include  lib_pypy  lib-python ...24$ ls -l25total 2026drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython27drwxr-xr-x  4 wena wena 4096 Feb  8 12:04 devguide28-rwxr-xr-x  1 wena wena  535 Feb 19 00:05 prog.py29drwxr-xr-x 14 wena wena 4096 Feb  7 00:59 pypy30-rw-r--r--  1 wena wena  741 Feb 18 01:01 rm-unused-function.patch31$ ls --help32Usage: ls [OPTION]... [FILE]...33List information about the FILEs (the current directory by default).34Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.35...36```3738Из этих четырёх команд можно извлечь несколько понятий:3940- Команда **ls** полезна при запуске без каких-либо опций. По умолчанию она выводит содержимое текущего каталога.41- Если нужно больше, чем даётся по умолчанию, мы сообщаем программе дополнительные сведения. В данном случае мы хотим показать другой каталог – `pypy`. Мы указали так называемый позиционный аргумент. Он назван так потому, что программа понимает, что делать со значением, только по его позиции в командной строке. Это понятие лучше видно на примере команды **cp**, простейшее использование которой – `cp SRC DEST`. Первая позиция – *что нужно скопировать*, а вторая – *куда скопировать*.42- Теперь представим, что мы хотим изменить поведение программы. В нашем примере мы выводим больше информации о каждом файле, а не только имена. `-l` в этом случае называется необязательным аргументом.43- Это фрагмент справки. Она очень полезна: вы можете встретить незнакомую программу и понять, как она работает, просто прочитав её справку.4445## Основы4647Начнём с очень простого примера, который (почти) ничего не делает:4849```python50import argparse51parser = argparse.ArgumentParser()52parser.parse_args()53```5455Ниже приведён результат выполнения кода:5657```console58$ python prog.py59$ python prog.py --help60usage: prog.py [-h]6162options:63  -h, --help  show this help message and exit64$ python prog.py --verbose65usage: prog.py [-h]66prog.py: error: unrecognized arguments: --verbose67$ python prog.py foo68usage: prog.py [-h]69prog.py: error: unrecognized arguments: foo70```7172Вот что происходит:7374- Запуск скрипта без опций не выводит ничего в stdout. Не очень полезно.75- Второй запуск начинает показывать полезность модуля [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse). Мы почти ничего не сделали, но уже получили хорошее сообщение справки.76- Опция `--help`, которую можно сократить до `-h`, – единственная опция, которую мы получаем бесплатно (т.е. её не нужно указывать). Всё остальное приводит к ошибке. Но даже в этом случае мы получаем полезное сообщение об использовании – тоже бесплатно.7778## Знакомство с позиционными аргументами7980Пример:8182```python83import argparse84parser = argparse.ArgumentParser()85parser.add_argument("echo")86args = parser.parse_args()87print(args.echo)88```8990И запуск кода:9192```console93$ python prog.py94usage: prog.py [-h] echo95prog.py: error: the following arguments are required: echo96$ python prog.py --help97usage: prog.py [-h] echo9899positional arguments:100  echo101102options:103  -h, --help  show this help message and exit104$ python prog.py foo105foo106```107108Вот что происходит:109110- Мы добавили метод [`add_argument()`](https://python-all.ru/3.15/library/argparse.html#argparse.ArgumentParser.add_argument), который используется для указания опций командной строки, которые программа готова принять. В данном случае я назвал его `echo`, чтобы оно соответствовало своей функции.111- Теперь для вызова программы требуется указать опцию.112- Метод [`parse_args()`](https://python-all.ru/3.15/library/argparse.html#argparse.ArgumentParser.parse_args) на самом деле возвращает некоторые данные из указанных опций, в данном случае `echo`.113- Переменная – это своего рода «магия», которую [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) выполняет бесплатно (т.е. не нужно указывать, в какой переменной хранится это значение). Вы также заметите, что её имя совпадает со строковым аргументом, переданным методу – `echo`.114115Однако обратите внимание, что, хотя справка выглядит красиво, пока она не так полезна, как могла бы быть. Например, мы видим, что у нас есть позиционный аргумент `echo`, но не знаем, что он делает – только догадываемся или читаем исходный код. Давайте сделаем его немного полезнее:116117```python118import argparse119parser = argparse.ArgumentParser()120parser.add_argument("echo", help="echo the string you use here")121args = parser.parse_args()122print(args.echo)123```124125И получаем:126127```console128$ python prog.py -h129usage: prog.py [-h] echo130131positional arguments:132  echo        echo the string you use here133134options:135  -h, --help  show this help message and exit136```137138А теперь давайте сделаем что-нибудь ещё более полезное:139140```python141import argparse142parser = argparse.ArgumentParser()143parser.add_argument("square", help="display a square of a given number")144args = parser.parse_args()145print(args.square**2)146```147148Ниже приведён результат выполнения кода:149150```console151$ python prog.py 4152Traceback (most recent call last):153  File "prog.py", line 5, in <module>154    print(args.square**2)155TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'156```157158Всё пошло не так. Это потому, что [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) воспринимает переданные ему параметры как строки, если не указать иное. Итак, укажем `argparse` воспринимать ввод как целое число:159160```python161import argparse162parser = argparse.ArgumentParser()163parser.add_argument("square", help="display a square of a given number",164                    type=int)165args = parser.parse_args()166print(args.square**2)167```168169Ниже приведён результат выполнения кода:170171```console172$ python prog.py 417316174$ python prog.py four175usage: prog.py [-h] square176prog.py: error: argument square: invalid int value: 'four'177```178179Всё прошло хорошо. Программа теперь даже корректно завершается при неверном вводе перед продолжением.180181## Знакомство с необязательными аргументами182183До сих пор мы работали с позиционными аргументами. Давайте посмотрим, как добавить необязательные.184185```python186import argparse187parser = argparse.ArgumentParser()188parser.add_argument("--verbosity", help="increase output verbosity")189args = parser.parse_args()190if args.verbosity:191    print("verbosity turned on")192```193194И вывод:195196```console197$ python prog.py --verbosity 1198verbosity turned on199$ python prog.py200$ python prog.py --help201usage: prog.py [-h] [--verbosity VERBOSITY]202203options:204  -h, --help            show this help message and exit205  --verbosity VERBOSITY206                        increase output verbosity207$ python prog.py --verbosity208usage: prog.py [-h] [--verbosity VERBOSITY]209prog.py: error: argument --verbosity: expected one argument210```211212Вот что происходит:213214- Программа написана так, чтобы выводить что-то, когда указан `--verbosity`, и ничего не выводить, если не указан.215- Чтобы показать, что опция действительно необязательна, при запуске программы без неё ошибки не возникает. Обратите внимание: по умолчанию, если необязательный аргумент не указан, соответствующая переменная (в данном случае `args.verbosity`) получает значение `None`, из-за чего она не проходит проверку на истинность в операторе [`if`](https://python-all.ru/3.15/reference/compound_stmts.html#if).216- Справочное сообщение немного отличается.217- При использовании опции `--verbosity` необходимо также указать некоторое значение, любое значение.218219В приведённом выше примере `--verbosity` принимает любые целые числа, но для нашей простой программы на самом деле полезны только два значения: `True` или `False`. Давайте соответствующим образом изменим код:220221```python222import argparse223parser = argparse.ArgumentParser()224parser.add_argument("--verbose", help="increase output verbosity",225                    action="store_true")226args = parser.parse_args()227if args.verbose:228    print("verbosity turned on")229```230231И вывод:232233```console234$ python prog.py --verbose235verbosity turned on236$ python prog.py --verbose 1237usage: prog.py [-h] [--verbose]238prog.py: error: unrecognized arguments: 1239$ python prog.py --help240usage: prog.py [-h] [--verbose]241242options:243  -h, --help  show this help message and exit244  --verbose   increase output verbosity245```246247Вот что происходит:248249- Теперь опция больше напоминает флаг, нежели что-то, требующее значения. Мы даже изменили имя опции в соответствии с этой идеей. Обратите внимание: теперь мы указываем новый ключевой аргумент `action` и присваиваем ему значение `"store_true"`. Это означает, что если опция указана, то `args.verbose` присваивается значение `True`. Если не указана – то `False`.250- Программа выдаёт ошибку, если указано значение, в полном соответствии с тем, что такое флаги на самом деле.251- Обратите внимание на другой текст справки.252253### Короткие опции254255Если вы знакомы с работой из командной строки, то заметили, что я ещё не касался темы коротких версий опций. Всё довольно просто:256257```python258import argparse259parser = argparse.ArgumentParser()260parser.add_argument("-v", "--verbose", help="increase output verbosity",261                    action="store_true")262args = parser.parse_args()263if args.verbose:264    print("verbosity turned on")265```266267И вот:268269```console270$ python prog.py -v271verbosity turned on272$ python prog.py --help273usage: prog.py [-h] [-v]274275options:276  -h, --help     show this help message and exit277  -v, --verbose  increase output verbosity278```279280Обратите внимание, что новая возможность также отражена в справочном тексте.281282## Сочетание позиционных и необязательных аргументов283284Наша программа становится всё сложнее:285286```python287import argparse288parser = argparse.ArgumentParser()289parser.add_argument("square", type=int,290                    help="display a square of a given number")291parser.add_argument("-v", "--verbose", action="store_true",292                    help="increase output verbosity")293args = parser.parse_args()294answer = args.square**2295if args.verbose:296    print(f"the square of {args.square} equals {answer}")297else:298    print(answer)299```300301А теперь вывод:302303```console304$ python prog.py305usage: prog.py [-h] [-v] square306prog.py: error: the following arguments are required: square307$ python prog.py 430816309$ python prog.py 4 --verbose310the square of 4 equals 16311$ python prog.py --verbose 4312the square of 4 equals 16313```314315- Мы вернули позиционный аргумент, отсюда и жалоба.316- Обратите внимание: порядок не важен.317318А что, если вернуть нашей программе возможность иметь несколько значений уровня подробности вывода и на самом деле их использовать:319320```python321import argparse322parser = argparse.ArgumentParser()323parser.add_argument("square", type=int,324                    help="display a square of a given number")325parser.add_argument("-v", "--verbosity", type=int,326                    help="increase output verbosity")327args = parser.parse_args()328answer = args.square**2329if args.verbosity == 2:330    print(f"the square of {args.square} equals {answer}")331elif args.verbosity == 1:332    print(f"{args.square}^2 == {answer}")333else:334    print(answer)335```336337И вывод:338339```console340$ python prog.py 434116342$ python prog.py 4 -v343usage: prog.py [-h] [-v VERBOSITY] square344prog.py: error: argument -v/--verbosity: expected one argument345$ python prog.py 4 -v 13464^2 == 16347$ python prog.py 4 -v 2348the square of 4 equals 16349$ python prog.py 4 -v 335016351```352353Все они выглядят хорошо, кроме последнего, который выявляет ошибку в нашей программе. Давайте исправим её, ограничив значения, которые может принимать опция `--verbosity`:354355```python356import argparse357parser = argparse.ArgumentParser()358parser.add_argument("square", type=int,359                    help="display a square of a given number")360parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],361                    help="increase output verbosity")362args = parser.parse_args()363answer = args.square**2364if args.verbosity == 2:365    print(f"the square of {args.square} equals {answer}")366elif args.verbosity == 1:367    print(f"{args.square}^2 == {answer}")368else:369    print(answer)370```371372И вывод:373374```console375$ python prog.py 4 -v 3376usage: prog.py [-h] [-v {0,1,2}] square377prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)378$ python prog.py 4 -h379usage: prog.py [-h] [-v {0,1,2}] square380381positional arguments:382  square                display a square of a given number383384options:385  -h, --help            show this help message and exit386  -v, --verbosity {0,1,2}387                        increase output verbosity388```389390Обратите внимание: изменение также отражается как в сообщении об ошибке, так и в строке справки.391392Теперь давайте применим другой подход к работе с подробностью вывода, который довольно распространён. Он также соответствует тому, как исполняемый файл CPython обрабатывает собственный аргумент подробности (проверьте вывод `python --help`):393394```python395import argparse396parser = argparse.ArgumentParser()397parser.add_argument("square", type=int,398                    help="display the square of a given number")399parser.add_argument("-v", "--verbosity", action="count",400                    help="increase output verbosity")401args = parser.parse_args()402answer = args.square**2403if args.verbosity == 2:404    print(f"the square of {args.square} equals {answer}")405elif args.verbosity == 1:406    print(f"{args.square}^2 == {answer}")407else:408    print(answer)409```410411Мы ввели ещё одно действие – «count», которое подсчитывает количество вхождений определённых опций.412413```console414$ python prog.py 441516416$ python prog.py 4 -v4174^2 == 16418$ python prog.py 4 -vv419the square of 4 equals 16420$ python prog.py 4 --verbosity --verbosity421the square of 4 equals 16422$ python prog.py 4 -v 1423usage: prog.py [-h] [-v] square424prog.py: error: unrecognized arguments: 1425$ python prog.py 4 -h426usage: prog.py [-h] [-v] square427428positional arguments:429  square           display a square of a given number430431options:432  -h, --help       show this help message and exit433  -v, --verbosity  increase output verbosity434$ python prog.py 4 -vvv43516436```437438- Да, теперь это больше похоже на флаг (аналогично `action="store_true"` в предыдущей версии нашего скрипта). Этим и объясняется жалоба.439- Кроме того, оно ведёт себя аналогично действию «store\_true».440- А вот демонстрация того, что даёт действие «count». Вы, вероятно, уже встречали подобное использование.441- А если не указывать флаг `-v`, считается, что этот флаг имеет значение `None`.442- Как и следовало ожидать, при указании длинной формы флага мы получим тот же результат.443- К сожалению, наш вывод справки не очень информативен о новых возможностях скрипта, но это всегда можно исправить, улучшив документацию (например, через именованный аргумент `help`).444- Последний вывод обнаруживает ошибку в нашей программе.445446Исправим:447448```python449import argparse450parser = argparse.ArgumentParser()451parser.add_argument("square", type=int,452                    help="display a square of a given number")453parser.add_argument("-v", "--verbosity", action="count",454                    help="increase output verbosity")455args = parser.parse_args()456answer = args.square**2457458# исправление ошибки: заменить == на >=459if args.verbosity >= 2:460    print(f"the square of {args.square} equals {answer}")461elif args.verbosity >= 1:462    print(f"{args.square}^2 == {answer}")463else:464    print(answer)465```466467И вот что получается:468469```console470$ python prog.py 4 -vvv471the square of 4 equals 16472$ python prog.py 4 -vvvv473the square of 4 equals 16474$ python prog.py 4475Traceback (most recent call last):476  File "prog.py", line 11, in <module>477    if args.verbosity >= 2:478TypeError: '>=' not supported between instances of 'NoneType' and 'int'479```480481- Первый вывод прошёл хорошо и исправляет предыдущую ошибку. То есть мы хотим, чтобы любое значение \>= 2 давало максимально подробный вывод.482- Третий вывод уже не так хорош.483484Исправим и эту ошибку:485486```python487import argparse488parser = argparse.ArgumentParser()489parser.add_argument("square", type=int,490                    help="display a square of a given number")491parser.add_argument("-v", "--verbosity", action="count", default=0,492                    help="increase output verbosity")493args = parser.parse_args()494answer = args.square**2495if args.verbosity >= 2:496    print(f"the square of {args.square} equals {answer}")497elif args.verbosity >= 1:498    print(f"{args.square}^2 == {answer}")499else:500    print(answer)501```502503Мы только что ввели ещё один именованный аргумент – `default`. Мы установили его в `0`, чтобы можно было сравнивать с другими целочисленными значениями. Помните: по умолчанию, если необязательный аргумент не указан, он получает значение `None`, и такое значение нельзя сравнить с целым числом (отсюда исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError)).504505И:506507```console508$ python prog.py 450916510```511512Уже с тем, что мы узнали, можно уйти довольно далеко, а мы только коснулись поверхности. Модуль [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) очень мощный, и мы рассмотрим его чуть подробнее, прежде чем завершить этот учебник.513514## Немного более продвинутый материал515516Что, если бы мы захотели расширить нашу крошечную программу, чтобы она вычисляла не только квадраты, но и другие степени:517518```python519import argparse520parser = argparse.ArgumentParser()521parser.add_argument("x", type=int, help="the base")522parser.add_argument("y", type=int, help="the exponent")523parser.add_argument("-v", "--verbosity", action="count", default=0)524args = parser.parse_args()525answer = args.x**args.y526if args.verbosity >= 2:527    print(f"{args.x} to the power {args.y} equals {answer}")528elif args.verbosity >= 1:529    print(f"{args.x}^{args.y} == {answer}")530else:531    print(answer)532```533534Вывод:535536```console537$ python prog.py538usage: prog.py [-h] [-v] x y539prog.py: error: the following arguments are required: x, y540$ python prog.py -h541usage: prog.py [-h] [-v] x y542543positional arguments:544  x                the base545  y                the exponent546547options:548  -h, --help       show this help message and exit549  -v, --verbosity550$ python prog.py 4 2 -v5514^2 == 16552```553554Обратите внимание: до сих пор мы использовали уровень подробности, чтобы *изменять* выводимый текст. В следующем примере уровень подробности используется, чтобы выводить *больше* текста:555556```python557import argparse558parser = argparse.ArgumentParser()559parser.add_argument("x", type=int, help="the base")560parser.add_argument("y", type=int, help="the exponent")561parser.add_argument("-v", "--verbosity", action="count", default=0)562args = parser.parse_args()563answer = args.x**args.y564if args.verbosity >= 2:565    print(f"Running '{__file__}'")566if args.verbosity >= 1:567    print(f"{args.x}^{args.y} == ", end="")568print(answer)569```570571Вывод:572573```console574$ python prog.py 4 257516576$ python prog.py 4 2 -v5774^2 == 16578$ python prog.py 4 2 -vv579Running 'prog.py'5804^2 == 16581```582583### Указание неоднозначных аргументов584585Когда есть неоднозначность в определении того, является ли аргумент позиционным или относится к другому аргументу, можно использовать `--`, чтобы указать [`parse_args()`](https://python-all.ru/3.15/library/argparse.html#argparse.ArgumentParser.parse_args), что всё после него – позиционные аргументы:586587```python588>>> parser = argparse.ArgumentParser(prog='PROG')589>>> parser.add_argument('-n', nargs='+')590>>> parser.add_argument('args', nargs='*')591592>>> # неоднозначно, поэтому parse_args считает это опцией593>>> parser.parse_args(['-f'])594usage: PROG [-h] [-n N [N ...]] [args ...]595PROG: error: unrecognized arguments: -f596597>>> parser.parse_args(['--', '-f'])598Namespace(args=['-f'], n=None)599600>>> # неоднозначно, поэтому опция -n жадно принимает аргументы601>>> parser.parse_args(['-n', '1', '2', '3'])602Namespace(args=[], n=['1', '2', '3'])603604>>> parser.parse_args(['-n', '1', '--', '2', '3'])605Namespace(args=['2', '3'], n=['1'])606```607608### Конфликтующие опции609610До сих пор мы работали с двумя методами экземпляра [`argparse.ArgumentParser`](https://python-all.ru/3.15/library/argparse.html#argparse.ArgumentParser). Познакомимся с третьим – [`add_mutually_exclusive_group()`](https://python-all.ru/3.15/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group). Он позволяет указывать опции, которые противоречат друг другу. Давайте также изменим остальную часть программы, чтобы новая функциональность стала более осмысленной: мы введём опцию `--quiet`, которая будет противоположностью опции `--verbose`:611612```python613import argparse614615parser = argparse.ArgumentParser()616group = parser.add_mutually_exclusive_group()617group.add_argument("-v", "--verbose", action="store_true")618group.add_argument("-q", "--quiet", action="store_true")619parser.add_argument("x", type=int, help="the base")620parser.add_argument("y", type=int, help="the exponent")621args = parser.parse_args()622answer = args.x**args.y623624if args.quiet:625    print(answer)626elif args.verbose:627    print(f"{args.x} to the power {args.y} equals {answer}")628else:629    print(f"{args.x}^{args.y} == {answer}")630```631632Наша программа теперь проще, и ради демонстрации мы потеряли часть функциональности. В любом случае, вот вывод:633634```console635$ python prog.py 4 26364^2 == 16637$ python prog.py 4 2 -q63816639$ python prog.py 4 2 -v6404 to the power 2 equals 16641$ python prog.py 4 2 -vq642usage: prog.py [-h] [-v | -q] x y643prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose644$ python prog.py 4 2 -v --quiet645usage: prog.py [-h] [-v | -q] x y646prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose647```648649Это должно быть легко понять. Я добавил последний вывод, чтобы вы могли увидеть, какую гибкость это даёт: например, смешивание длинной и короткой форм опций.650651Прежде чем закончить, вы, вероятно, захотите сообщить пользователям основное назначение вашей программы, на случай если они не знают:652653```python654import argparse655656parser = argparse.ArgumentParser(description="calculate X to the power of Y")657group = parser.add_mutually_exclusive_group()658group.add_argument("-v", "--verbose", action="store_true")659group.add_argument("-q", "--quiet", action="store_true")660parser.add_argument("x", type=int, help="the base")661parser.add_argument("y", type=int, help="the exponent")662args = parser.parse_args()663answer = args.x**args.y664665if args.quiet:666    print(answer)667elif args.verbose:668    print(f"{args.x} to the power {args.y} equals {answer}")669else:670    print(f"{args.x}^{args.y} == {answer}")671```672673Обратите внимание на небольшое различие в тексте использования. Обратите внимание на `[-v | -q]`, который сообщает, что мы можем использовать либо `-v`, либо `-q`, но не оба одновременно:674675```console676$ python prog.py --help677usage: prog.py [-h] [-v | -q] x y678679calculate X to the power of Y680681positional arguments:682  x              the base683  y              the exponent684685options:686  -h, --help     show this help message and exit687  -v, --verbose688  -q, --quiet689```690691## Как перевести вывод argparse692693Вывод модуля [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse), такой как текст справки и сообщения об ошибках, можно сделать переводимым с помощью модуля [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext). Это позволяет приложениям легко локализовать сообщения, создаваемые `argparse`. См. также [Интернационализация ваших программ и модулей](https://python-all.ru/3.15/library/gettext.html#i18n-howto).694695Например, в этом выводе [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse):696697```console698$ python prog.py --help699usage: prog.py [-h] [-v | -q] x y700701calculate X to the power of Y702703positional arguments:704  x              the base705  y              the exponent706707options:708  -h, --help     show this help message and exit709  -v, --verbose710  -q, --quiet711```712713Строки `usage:`, `positional arguments:`, `options:` и `show this help message and exit` – все переводимы.714715Чтобы перевести эти строки, их сначала нужно извлечь в файл `.po`. Например, с помощью [Babel](https://python-all.ru/3.15/howto/argparse.html) выполните следующую команду:716717```console718$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py719```720721Эта команда извлекает все переводимые строки из модуля [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) и выводит их в файл с именем `messages.po`. Команда предполагает, что ваша установка Python находится в `/usr/lib`.722723Узнать расположение модуля [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) в вашей системе можно с помощью следующего скрипта:724725```python726import argparse727print(argparse.__file__)728```729730После того как сообщения в файле `.po` будут переведены и переводы установлены с помощью [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext), [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) сможет отображать переведённые сообщения.731732Чтобы перевести собственные строки в выводе [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse), используйте [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext).733734## Пользовательские преобразователи типов735736Модуль [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) позволяет указать пользовательские преобразователи типов для аргументов командной строки. Это даёт возможность изменять ввод пользователя до того, как он будет сохранён в [`argparse.Namespace`](https://python-all.ru/3.15/library/argparse.html#argparse.Namespace). Это может быть полезно, когда необходимо предварительно обработать ввод перед его использованием в программе.737738При использовании пользовательского преобразователя типов можно применять любой вызываемый объект, который принимает один строковый аргумент (значение аргумента) и возвращает преобразованное значение. Однако если нужно обрабатывать более сложные сценарии, можно использовать пользовательский класс действия с параметром **action**.739740Например, предположим, что нужно обрабатывать аргументы с разными префиксами и соответствующим образом их обрабатывать:741742```python743import argparse744745parser = argparse.ArgumentParser(prefix_chars='-+')746747parser.add_argument('-a', metavar='<value>', action='append',748                    type=lambda x: ('-', x))749parser.add_argument('+a', metavar='<value>', action='append',750                    type=lambda x: ('+', x))751752args = parser.parse_args()753print(args)754```755756Вывод:757758```console759$ python prog.py -a value1 +a value2760Namespace(a=[('-', 'value1'), ('+', 'value2')])761```762763В этом примере мы:764765- Создали синтаксический анализатор с пользовательскими символами префиксов, используя параметр `prefix_chars`.766- Определили два аргумента, `-a` и `+a`, которые использовали параметр `type` для создания пользовательских преобразователей типов, чтобы сохранить значение в кортеже с префиксом.767768Без пользовательских преобразователей типов аргументы рассматривали бы `-a` и `+a` как один и тот же аргумент, что было бы нежелательно. Используя пользовательские преобразователи типов, мы смогли различать эти два аргумента.769770## Заключение771772Модуль [`argparse`](https://python-all.ru/3.15/library/argparse.html#module-argparse) предлагает гораздо больше, чем показано здесь. Его документация весьма подробна и обстоятельна, полна примеров. Пройдя этот учебник, вы легко сможете её усвоить, не чувствуя перегрузки.773