Модуль argparse (заменяет устаревший optparse) применяется при анализе параметров командной строки. Интерфейс командной строки, предоставленный проектом HowDoI, использует argparse — вы можете обратиться к нему при создании собственного интерфейса командной строки.
Рассмотрим код генерации анализатора:
import argparse
#
#… пропускаем кучу кода…
#
def get_parser():
····parser = argparse.ArgumentParser(description='…truncated for brevity…')
····parser.add_argument('query', metavar='QUERY', type=str, nargs='*',
························help='the question to answer')
····parser.add_argument('-p','-pos',
························help='select answer in specified position (default: 1)',
························default=1, type=int)
····parser.add_argument('-a','-all', help='display the full text
························of the answer',
························action='store_true')
····parser.add_argument('-l','-link', help='display only the answer link',
························action='store_true')
····parser.add_argument('-c', '-color', help='enable colorized output',
························action='store_true')
····parser.add_argument('-n','-num-answers', help='number of answers
························to return',
························default=1, type=int)
····parser.add_argument('-C','-clear-cache', help='clear the cache',
························action='store_true')
····parser.add_argument('-v','-version',
························help='displays the current version of howdoi',
························action='store_true')
····return parser
Анализатор проверит командную строку и создаст словарь, в котором соотносятся все аргументы и значения. Конструкция action='store_true' показывает, что параметр является флагом. При наличии в командной строке он будет сохранен как True в словаре анализатора.
Основной принцип docopt ( http://docopt.org/) заключается в том, что документация должна быть красивой и понятной. Библиотека предоставляет одну основную команду docopt.docopt(), а также несколько функций и классов для удобства продвинутых пользователей. Функция docopt.docopt() принимает инструкции в стиле POSIX, написанные разработчиком, использует их для интерпретации аргументов командной строки и возвращает словарь со всеми аргументами и параметрами, полученными из командной строки. Также она корректно обрабатывает параметры — help и — version.
В следующем примере значение переменной arguments — это словарь, который имеет ключ name, — capitalize и — num_repetitions:
#!/usr/bin env python3
"""Здоровается с вами.
··Использование:
····hello … [options]
····hello — h | — help | — version
····-c, — capitalize писать ли имя с большой буквы
····-n REPS, — num_repetitions=REPS количество повторений [по умолчанию: 1]
"""
__version__ = "1.0.0" # Необходимо для параметра — version
def hello(name, repetitions=1):
····for rep in range(repetitions):
········print('Hello {}'.format(name))
if __name__ == "__main__":
····from docopt import docopt
····arguments = docopt(__doc__, version=__version__)
····name = ' '.join(arguments[''])
····repetitions = arguments['-num_repetitions']
····if arguments['-capitalize']:
········name = name.upper()
····hello(name, repetitions=repetitions)
Начиная с версии 0.6.0 docopt может использоваться для создания сложных программ с субкомандами, которые ведут себя как команды git ( https://git-scm.com/) или svn ( https://subversion.apache.org/) (даже если субкоманды написаны на разных языках). Существует полный пример приложения ( https://github.com/docopt/docopt/tree/master/examples/git), имитирующий реализацию команды git, который показывает, как это возможно.
Философия Plac ( https://pypi.python.org/pypi/plac) заключается в том, что вся информация, необходимая для анализа вызова команды, находится в сигнатуре целевой функции. Библиотека легковесна (примерно 200 строк), оборачивает argparse ( http://docs.python.org/2/library/argparse.html) из стандартной библиотеки и предоставляет одну основную команду plac.plac(), которая получает анализатор аргумента из сигнатуры функции, анализирует командную строку, а затем вызывает функцию.
Библиотека должна была называться анализатором аргументов командной строки (Command-Line Argument Parser, clap), имя оказалось занято, поэтому она называется Plac — clap, почти наоборот. Руководство по использованию не особо информативно, но посмотрите, как мало строк в этом примере:
# hello.py
def hello(name, capitalize=False, repetitions=1):
··"""Здоровается с вами."""
····if capitalize:
········name = name.upper()
····for rep in range(repetitions):
········print('Hello {}'.format(name))
if __name__ == "__main__":
Читать дальше