Модуль 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: #!
"""Здоровается с вами.
Использование:
hello
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):