Читаем Автостопом по 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):

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

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

Из жизни попаданцев
Из жизни попаданцев

Уважаемые читатели! Этот фанфик не пропагандирует идеи национал-социализма и идеалы СС. Автор считает, что лучше всего в непривычный мир может вписаться разведчик или диверсант. Учитывая начало фика, лучшим кандидатом на роль главного героя оказался немец. Автор много читал про диверсантов времен ВМВ. Образ главного героя собирательный, автор использовал факты биографии некоторых друзей и подчиненных Отто Скорцени. Если по каким-либо причинам такой главный герой является для вас неприемлемым, то, убедительная просьба, ПРОСТО НЕ ЧИТАЙТЕ.Ну, а для тех, кто всё-таки решился... В 1945 году Дамблдор и Гриндевальд проводили некий ритуал. Ритуал сорвал офицер СС… «Внизу у лестницы обнаружился еще один труп. Его унесли вместе с трупом красноглазого. Насколько я понял, это был хозяин дома и муж Лили, а также отец маленького Гарри, некий Джеймс Поттер. Честно говоря, я даже обрадовался этому обстоятельству. Во-первых, муж точно заметил бы, что с женой что-то не так, а во-вторых, только мужа мне и не хватало. В-третьих, в гостиной обнаружилась газета со странными движущимися картинками. А на газете была дата… 31 октября 1981 года…»Да-да, мать маленького Гарри осталась жива. Чудом уцелела. Вот, только...

Алексей Бухтояров , Заязочка , Заязочка

Неотсортированное / Фанфик / Попаданцы