Читаем Автостопом по Python полностью

Модуль 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

Основной принцип docopt (http://docopt.org/) заключается в том, что документация должна быть красивой и понятной. Библиотека предоставляет одну основную команду docopt.docopt(), а также несколько функций и классов для удобства продвинутых пользователей. Функция docopt.docopt() принимает инструкции в стиле POSIX, написанные разработчиком, использует их для интерпретации аргументов командной строки и возвращает словарь со всеми аргументами и параметрами, полученными из командной строки. Также она корректно обрабатывает параметры --help и --version.

В следующем примере значение переменной arguments — это словарь, который имеет ключ name, --capitalize и --num_repetitions: #!usrbin 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

Философия 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__":

import plac

plac.call(hello)

Руководство по использованию выглядит так:

$ python hello.py --help

usage: hello.py [-h] name [capitalize] [repetitions]

Says hello to you.

positional arguments:

name

capitalize [False]

repetitions [1]

optional arguments:

-h, --help show this help message and exit

Если хотите выполнить преобразование типов для какого-нибудь аргумента до того, как передадите его в функцию, используйте декоратор annotations: import plac

@plac.annotations(

name = plac.Annotation("the name to greet", type=str),

capitalize = plac.Annotation("use allcaps", kind="flag", type=bool), repetitions = plac.Annotation("total repetitions", kind="option",

type=int)

def hello(name, capitalize=False, repetitions=1):

"""Здоровается с вами."""

if capitalize:

name = name.upper()

for rep in range(repetitions):

Перейти на страницу:

Похожие книги

100 знаменитых харьковчан
100 знаменитых харьковчан

Дмитрий Багалей и Александр Ахиезер, Николай Барабашов и Василий Каразин, Клавдия Шульженко и Ирина Бугримова, Людмила Гурченко и Любовь Малая, Владимир Крайнев и Антон Макаренко… Что объединяет этих людей — столь разных по роду деятельности, живущих в разные годы и в разных городах? Один факт — они так или иначе связаны с Харьковом.Выстраивать героев этой книги по принципу «кто знаменитее» — просто абсурдно. Главное — они любили и любят свой город и прославили его своими делами. Надеемся, что эти сто биографий помогут читателю почувствовать ритм жизни этого города, узнать больше о его истории, просто понять его. Тем более что в книгу вошли и очерки о харьковчанах, имена которых сейчас на слуху у всех горожан, — об Арсене Авакове, Владимире Шумилкине, Александре Фельдмане. Эти люди создают сегодняшнюю историю Харькова.Как знать, возможно, прочитав эту книгу, кто-то испытает чувство гордости за своих знаменитых земляков и посмотрит на Харьков другими глазами.

Владислав Леонидович Карнацевич

Неотсортированное / Энциклопедии / Словари и Энциклопедии