Выбор библиотеки разбора аргументов командной строки¶
Этот документ описывает выбор библиотеки для разбора аргументов командной строки. Назначение: реализация команды “grep” в нашем мини-cli. Необходимые возможности команды:
поддерживать ключи
- -i (нечувствительность к регистру),
- -w (поиск только слов целиком),
- -A n (распечатать n строк после строки с совпадением);
поддерживать регулярные выражения в строке поиска;
Рассмотренные библиотеки:
- argparse https://docs.python.org/3/library/argparse.html
- getopt https://docs.python.org/3.6/library/getopt.html
- docopt http://docopt.org/
- click http://click.pocoo.org/6/
argparse и getopt поставляются в стандартной библиотеке Python. Впрочем, про getopt написано, что она предназначена для тех, кто использовал похожую библиотеку на языке С. Поэтому в дальнейшем getopt я не рассматривал.
Я прочёл сравнительный обзор оставшихся библиотек (argparse, docopt, click) https://realpython.com/blog/python/comparing-python-command-line-parsing-libraries-argparse-docopt-click/. Также почитал документацию (не полностью) для каждой библиотеки.
Плюсы и минусы библиотек (по моему мнению, применительно к данной задаче и уже написанной части кода cli):
argparse
- + я имею опыт работы с этой библиотекой
- + не является внешней зависимостью, так как включена в стандартную библиотеку
- + много документации, с примерами
- - нужно писать много кода (по сравнению с другими вариантами)
docopt
- + можно декларативно написать, какое поведение ожидается от парсера
- + получаем дополнительную документацию саму собой
- - давно не обновлялась
- - нужно писать код, проверяющий, что всё распарсилось и что типы соответствуют
- - неочевидно, что делать, если use-case сложный
click
- + видел отзывы в интернете, что эта библиотека самая хорошая
- - не смог прочесть документацию. Она написана, казалось бы, неплохо, но мне
- сложно её читать. Она описывает use-case, которые мне не интересны, да ещё и в непонятном порядке
click я больше не стал рассматривать, так как не смог в нём разобраться. Возможно, это действительно хорошая библиотека и стоит её рассмотреть ещё раз при необходимости.
Из оставшихся двух вариантов - argparse и docopt - я выбрал docopt. Он лучше вписывается в то обилие документации, которое уже есть в проекте. К тому же, сценарий использования в случае grep довольно простой, поэтому docopt справится. Плюс, хочется попробовать что-то новое, но без ущерба результату.