Выбор библиотеки разбора аргументов командной строки

Этот документ описывает выбор библиотеки для разбора аргументов командной строки. Назначение: реализация команды “grep” в нашем мини-cli. Необходимые возможности команды:

  • поддерживать ключи

    • -i (нечувствительность к регистру),
    • -w (поиск только слов целиком),
    • -A n (распечатать n строк после строки с совпадением);
  • поддерживать регулярные выражения в строке поиска;

Рассмотренные библиотеки:

  1. argparse https://docs.python.org/3/library/argparse.html
  2. getopt https://docs.python.org/3.6/library/getopt.html
  3. docopt http://docopt.org/
  4. 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):

  1. argparse

    • + я имею опыт работы с этой библиотекой
    • + не является внешней зависимостью, так как включена в стандартную библиотеку
    • + много документации, с примерами
    • - нужно писать много кода (по сравнению с другими вариантами)
  2. docopt

    • + можно декларативно написать, какое поведение ожидается от парсера
    • + получаем дополнительную документацию саму собой
    • - давно не обновлялась
    • - нужно писать код, проверяющий, что всё распарсилось и что типы соответствуют
    • - неочевидно, что делать, если use-case сложный
  3. click

    • + видел отзывы в интернете, что эта библиотека самая хорошая
    • - не смог прочесть документацию. Она написана, казалось бы, неплохо, но мне
      сложно её читать. Она описывает use-case, которые мне не интересны, да ещё и в непонятном порядке

click я больше не стал рассматривать, так как не смог в нём разобраться. Возможно, это действительно хорошая библиотека и стоит её рассмотреть ещё раз при необходимости.

Из оставшихся двух вариантов - argparse и docopt - я выбрал docopt. Он лучше вписывается в то обилие документации, которое уже есть в проекте. К тому же, сценарий использования в случае grep довольно простой, поэтому docopt справится. Плюс, хочется попробовать что-то новое, но без ущерба результату.