Сообщить об ошибке.

Класс ArgumentParser() модуля argparse в Python

Описание аргументов конструктора класса argparse.ArgumentParser()

Синтаксис:

import argparse

parser = 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)

Параметры:

  • prog=None - имя программы (по умолчанию: sys.argv[0]),
  • usage=None - строка, описывающая использование программы,
  • description=None - текст для отображения перед аргументом справка,
  • epilog=None - текст для отображения после аргумента справка,
  • parents=[] - список объектов ArgumentParser, аргументы которых также должны быть включены,
  • formatter_class=argparse.HelpFormatter - класс для настройки вывода справки,
  • prefix_chars='-' - префиксы необязательных параметров командной строки,
  • fromfile_prefix_chars=None - префиксы файлов, из которых должны быть прочитаны дополнительные параметры,
  • argument_default=None - глобальное значение для параметров командной строки по умолчанию,
  • conflict_handler='error' - стратегия разрешения конфликтов опций,
  • add_help=True - добавляет опцию a -h/--help в синтаксический анализатор,
  • allow_abbrev=True - сокращает длинные варианты, если аббревиатура однозначна,
  • exit_on_error=True - определяет, завершает ли ArgumentParser работу с информацией об ошибке при возникновении ошибки.

Возвращаемое значение:

  • новый объект ArgumentParser (описание методов смотрите далее, в других разделах)

Описание:

Класс ArgumentParser() модуля argparse создает новый объект ArgumentParser. Все параметры должны передаваться в качестве ключевых аргументов. Каждый параметр имеет свое собственное более подробное описание ниже.

Аргумент prog=None.

По умолчанию объекты ArgumentParser используют sys.argv[0] для определения способа отображения имени программы в справочных сообщениях. Это значение по умолчанию почти всегда корректно, потому что оно заставляет справочные сообщения соответствовать тому, как программа была вызвана из командной строки. Например, рассмотрим файл myprogram.py со следующим кодом:

# myprogram.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()

На экране появится справка, в качестве имени программы будет myprogram.py (независимо от того, откуда была вызвана программа):

$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help
$ cd ..
$ python subdir/myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help

Чтобы изменить это поведение по умолчанию, можно указать другое значение с помощью аргумента prog:

>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
# usage: myprogram [-h]
# 
# optional arguments:
#  -h, --help  show this help message and exit

Обратите внимание, что имя программы, независимо от того, определено ли оно из sys.argv[0] или из аргумента prog, доступно для справочных сообщений с использованием спецификатора формата %(prog)s.

>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
# usage: myprogram [-h] [--foo FOO]
# 
# optional arguments:
#  -h, --help  show this help message and exit
#  --foo FOO   foo of the myprogram program

Аргумент usage=None.

По умолчанию argparse.ArgumentParser() вычисляет сообщение об использовании на основе содержащихся в нем аргументов:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
# usage: PROG [-h] [--foo [FOO]] bar [bar ...]
# 
# positional arguments:
#  bar          bar help
# 
# optional arguments:
#  -h, --help   show this help message and exit
#  --foo [FOO]  foo help

Сообщение по умолчанию можно изменить с помощью аргумента usage:

>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
# usage: PROG [options]
# 
# positional arguments:
#  bar          bar help
# 
# optional arguments:
#  -h, --help   show this help message and exit
#  --foo [FOO]  foo help

Спецификатор формата %(prog)s доступен для вывода имени программы в сообщениях об использовании скрипта.

Аргумент description=None.

Большинство вызовов конструктора ArgumentParser() будут использовать аргумент description. Этот аргумент дает краткое описание того, что делает программа и как она работает. В справочных сообщениях описание отображается между строкой использования командной строки и справочными сообщениями для различных аргументов:

>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
# usage: argparse.py [-h]
# 
# A foo that bars
# 
# optional arguments:
#  -h, --help  show this help message and exit

По умолчанию описание будет обернуто в строку так, чтобы оно помещалось в заданное пространство. Чтобы изменить это поведение, смотрите аргумент formatter_class.

Аргумент epilog=None.

Некоторые программы любят выводить дополнительное описание программы после описания аргументов. Такой текст может быть задан с помощью аргумента epilog:

>>> parser = argparse.ArgumentParser(
...     description='A foo that bars',
...     epilog="And that's how you'd foo a bar")
>>> parser.print_help()
# usage: argparse.py [-h]
# 
# A foo that bars
# 
# optional arguments:
#  -h, --help  show this help message and exit
# 
# And that's how you'd foo a bar

Как и в случае с аргументом description, epilog по умолчанию заключен в строку, но это поведение можно настроить с помощью аргумента formatter_class для ArgumentParser.

Аргумент parents=[].

Иногда несколько парсеров могут использовать общий набор опций командной строки. Вместо того чтобы повторять определения этих параметров, можно использовать один синтаксический анализатор со всеми общими параметрами и передать их в аргумент parents. Аргумент parents принимает список объектов из родительского ArgumentParser, собирает из него все позиционные и необязательные параметры и добавляет их действия в новый создаваемый объект ArgumentParser:

>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)

>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
# Namespace(foo='XXX', parent=2)

>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
# Namespace(bar='YYY', parent=None)

Обратите внимание, что в большинстве родительских парсеров аргумент add_help=False. В противном случае ArgumentParser увидит два параметра -h/--help (один в родительском и один в дочернем) и вызовет ошибку.

Примечание. Необходимо полностью инициализировать парсеры, прежде чем передавать их через аргумент parent. Если изменить родительские парсеры после дочернего парсера, то эти изменения не будут отражены в дочернем парсере.

Аргумент formatter_class=argparse.HelpFormatter.

Объекты ArgumentParser позволяют настроить форматирование справки, указав альтернативный класс форматирования. В настоящее время существует четыре таких класса:

  • argparse.RawDescriptionHelpFormatter,
  • argparse.RawTextHelpFormatter,
  • argparse.ArgumentDefaultsHelpFormatter,
  • argparse.MetavarTypeHelpFormatter.

Классы форматирования RawDescriptionHelpFormatter и RawTextHelpFormatter обеспечивают больший контроль над отображением текстовых описаний. По умолчанию объекты ArgumentParser переносят текст описания и эпилога в справочные сообщения командной строки:

>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     description='''this description
...         was indented weird
...             but that is okay''',
...     epilog='''
...             likewise for this epilog whose whitespace will
...         be cleaned up and whose words will be wrapped
...         across a couple lines''')
>>> parser.print_help()
# usage: PROG [-h]
# 
# this description was indented weird but that is okay
# 
# optional arguments:
#  -h, --help  show this help message and exit
# 
# likewise for this epilog whose whitespace will be cleaned up and whose words
# will be wrapped across a couple lines

Передача класса RawDescriptionHelpFormatter через аргумент formatter_class указывает на то, что описание и эпилог уже правильно отформатированы и не должны быть завернуты в строку:

>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.RawDescriptionHelpFormatter,
...     description=textwrap.dedent('''\
...         Please do not mess up this text!
...         --------------------------------
...             I have indented it
...             exactly the way
...             I want it
...         '''))
>>> parser.print_help()
# usage: PROG [-h]
# 
# Please do not mess up this text!
# --------------------------------
#    I have indented it
#    exactly the way
#    I want it
# 
# optional arguments:
#  -h, --help  show this help message and exit

Класс форматирования RawTextHelpFormatter сохраняет пробелы для всех видов текста справки, включая описания аргументов. Однако несколько новых строк заменяются одной. Если необходимо сохранить несколько пустых строк, то добавьте пробелы между символами новой строки.

Класс форматирования ArgumentDefaultsHelpFormatter автоматически добавляет информацию о значениях по умолчанию в каждое из справочных сообщений аргумента:

>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
# usage: PROG [-h] [--foo FOO] [bar ...]
# 
# positional arguments:
#  bar         BAR! (default: [1, 2, 3])
# 
# optional arguments:
#  -h, --help  show this help message and exit
#  --foo FOO   FOO! (default: 42)

Класс форматирования MetavarTypeHelpFormatter в качестве отображаемого имени для значений параметров использует тип параметра каждого аргумента, вместо использования аргумента метода dest, как это делает обычный форматер:

>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
# usage: PROG [-h] [--foo int] float
# 
# positional arguments:
#   float
# 
# optional arguments:
#   -h, --help  show this help message and exit
#   --foo int

Аргумент prefix_chars='-'.

Большинство параметров командной строки будут использовать символ '-' в качестве префикса, например -f/--foo. Парсеры, которым необходимо поддерживать разные или дополнительные символы префикса, например для таких параметров, как +f или /foo, их можно указать с помощью аргумента prefix_chars конструктора ArgumentParser():

>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
# Namespace(bar='Y', f='X')

Аргумент prefix_chars по умолчанию равен '-'. Если указать набор символов, не включающий '-', то параметры -f/--foo будут запрещены.

Аргумент fromfile_prefix_chars=None.

Иногда, например, при работе с особенно длинными списками аргументов, может иметь смысл сохранить список аргументов в файле, а не вводить его в командной строке. Если аргумент fromfile_prefix_chars передан конструктору argparse.ArgumentParser, то аргументы, начинающиеся с любого из указанных символов, будут рассматриваться как файлы и будут заменены содержащимися в них аргументами. Например:

>>> with open('args.txt', 'w') as fp:
...     fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
# Namespace(f='bar')

Аргументы, считываемые из файла, по умолчанию должны быть по одному в каждой строке (но смотрите также метод parser.convert_arg_line_to_args()) и обрабатываются так, как если бы они находились в командной строке в том же месте, что и исходный аргумент ссылки на файл. Так, в приведенном выше примере выражение ['-f', 'foo', '@args.txt'] считается эквивалентным выражению ['-f', 'foo', '-f', 'bar'].

Аргумент fromfile_prefix_chars по умолчанию равен None и означает, что аргументы никогда не будут рассматриваться как ссылки на файлы.

Класс ArgumentParser использует кодировку файловой системы и обработчик ошибок для чтения файла, содержащего аргументы.

Изменено в Python 3.12: Класс ArgumentParser изменил кодировку и ошибки для чтения файлов аргументов со стандартных (например, locale.getpreferredencoding(False) и "strict") на кодировку файловой системы и обработчик ошибок. Файл аргументов должен быть закодирован в UTF-8 вместо кодовой страницы ANSI в Windows.

Аргумент argument_default=None.

Как правило, значения аргументов по умолчанию задаются либо путем передачи значения по умолчанию в метод parser.add_argument(), либо путем вызова методов parser.set_defaults() с определенным набором пар имя-значение. Но иногда может быть полезно указать для аргументов единственное значение по умолчанию для всего парсера. Это можно сделать, передав аргумент argument_default. Например, чтобы глобально подавить создание атрибутов при вызовах parser.parse_args(), мы присвоим argument_default=SUPPRESS:

>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
# Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
# Namespace()

Аргумент conflict_handler='error'.

Объекты ArgumentParser не допускают двух действий с одной и той же строкой параметров. По умолчанию, если предпринимается попытка создать аргумент с уже используемой строкой параметров, то объекты ArgumentParser вызывают исключение ArgumentError:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
# Traceback (most recent call last):
#  ..
# ArgumentError: argument --foo: conflicting option string(s): --foo

Иногда, при использовании параметров родительских парсеров может быть полезно просто переопределить некоторые родительские аргументы с той же строкой опций. Чтобы получить такое поведение, передайте в аргумент conflict_handler значение 'resolve':

>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
# usage: PROG [-h] [-f FOO] [--foo FOO]
# 
# optional arguments:
#  -h, --help  show this help message and exit
#  -f FOO      old foo help
#  --foo FOO   new foo help

Обратите внимание, что объекты ArgumentParser удаляют действие только в том случае, если все его строки параметров переопределены. Итак, в приведенном выше примере старое действие -f/--foo сохраняется как действие -f, потому что была переопределена только строка параметра --foo.

Аргумент add_help=True.

По умолчанию объекты ArgumentParser добавляют опцию, которая просто отображает справочное сообщение синтаксического анализатора. Например, рассмотрим файл с именем myprogram.py содержащий следующий код:

# myprogram.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()

Если в командной строке задано значение -h или --help, то будет напечатана справка:

$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help

Иногда может оказаться полезным отключить добавление опции справки. Это может быть достигнуто путем передачи add_help=False:

>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
# usage: PROG [--foo FOO]
# 
# optional arguments:
#  --foo FOO  foo help

Параметр справки обычно имеет вид -h/--help. Исключением из этого правила является то, что prefix_chars указан и не включает символ '-', тогда -h и --help не являются допустимыми опциями. В этом случае первый символ в prefix_chars используется для префикса параметров справки:

>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
>>> parser.print_help()
# usage: PROG [+h]
# 
# optional arguments:
#   +h, ++help  show this help message and exit

Аргумент allow_abbrev=True.

Обычно, при передаче списка аргументов методу parser.parse_args(), он распознает сокращения длинных параметров.

Эту функцию можно отключить, установив для allow_abbrev значение False:

>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
# usage: PROG [-h] [--foobar] [--foonley]
# PROG: error: unrecognized arguments: --foon

Аргумент exit_on_error=True.

Новое в Python 3.9.

Обычно, когда методу parser.parse_args() передается недопустимый список параметров командной строки, то вызов завершается с информацией об ошибке.

Если пользователь хочет отлавливать ошибки вручную, то эту функцию можно включить, установив для exit_on_error значение False:

>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
# _StoreAction(option_strings=['--integers'], dest='integers', nargs=None, 
#              const=None, default=None, type=<class 'int'>, 
#              choices=None, help=None, metavar=None)
>>> try:
...     parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
...     print('Catching an argumentError')
...
# Catching an argumentError