Почему Click?
Существует множество библиотек для написания утилит командной строки; почему же существует Click?
Ответ на этот вопрос прост: потому что нет ни одной утилиты командной строки для Python, которая удовлетворяет следующим требованиям:
- Ленивая композиция без ограничений.
- Поддержка реализации соглашений командной строки Unix/POSIX.
- Поддержка загрузки значений из переменных окружения без дополнительных настроек.
- Поддержка запроса пользовательских значений.
- Полная вложенность и композиция.
- Поддержка обработки файлов без дополнительных настроек.
- Включает полезные общие вспомогательные функции (получение размеров терминала, ANSI-цветов, получение прямого ввода с клавиатуры, очистка экрана, поиск путей к конфигурационным файлам, запуск приложений и редакторов и т. д.).
Существует много альтернатив Click; очевидные из них — optparse и argparse из стандартной библиотеки. Посмотрите, может что-то еще вас заинтересует.
Click фактически реализует собственный парсер аргументов и не использует optparse или argparse, следуя поведению парсинга optparse. Причина, по которой он не основан на argparse, заключается в том, что argparse по своей конструкции не позволяет правильно вкладывать команды и имеет некоторые недостатки при обработке аргументов, совместимых с POSIX.
Click разработан для того, чтобы быть интересным и настраиваемым, но не слишком гибким. Например, настройка страниц справки ограничена. Это ограничение сделано намеренно, так как Click обещает, что несколько экземпляров Click будут продолжать работать должным образом, когда их объединят.
Слишком большая настраиваемость нарушит это обещание.
Click был написан для поддержки микрофреймворка Flask, потому что ни один инструмент не мог предоставить ему необходимую функциональность.
Для того, чтобы понять, что такое Click, настоятельно рекомендуется ознакомиться с главой Сложные приложения.
Почему не Argparse?
Click внутренне основан на optparse вместо argparse. Это деталь реализации, о которой пользователь не должен беспокоиться. Click не основан на argparse, потому что у него есть некоторые особенности, которые затрудняют обработку произвольных интерфейсов командной строки:
-
argparseимеет встроенное поведение, чтобы угадать, является ли что-то аргументом или опцией. Это становится проблемой при работе с неполными командными строками; поведение становится непредсказуемым без полного знания командной строки. Это противоречит стремлению Click передавать управление подпарсерам. -
argparseне поддерживает отключение вставленных аргументов. Без этой функции невозможно безопасно реализовать вложенный парсинг Click.
Почему не Docopt и т.д.?
Docopt и многие подобные инструменты интересны в работе, но очень немногие из них занимаются вложением команд и композицией таким образом, как Click. Насколько известно разработчикам, Click является первой библиотекой Python, которая стремится создать уровень композиции приложений, выходящий за рамки того, что поддерживает сама система.
Docopt, например, анализирует ваши страницы справки, а затем анализирует их в соответствии с этими правилами. Побочным эффектом этого является то, что Docopt довольно жёстко обрабатывает интерфейс командной строки. Преимущество Docopt заключается в том, что он даёт вам сильный контроль над вашей страницей справки; недостаток заключается в том, что из-за этого он не может переформировать ваш вывод для текущей ширины терминала и затрудняет переводы. Кроме того, Docopt ограничен базовым парсингом. Он не обрабатывает передачу аргументов и вызов обратных функций или типы. Это означает, что необходимо написать много кода помимо базовой страницы справки для обработки результатов парсинга.
Но самое главное, это затрудняет композицию. Хотя Docopt поддерживает передачу управления подкомандам, он, например, не поддерживает прямого автоматического перечисления подкоманд на основе доступных возможностей, или он не обеспечивает согласованной работы подкоманд.
Это нормально, но это отличается от того, как Click хочет работать. Click стремится поддерживать полностью композируемые пользовательские интерфейсы командной строки, выполняя следующие действия:
- Click не просто анализирует, он также передает управление соответствующему коду.
- У Click есть сильное понятие контекста вызова, которое позволяет подкомандам реагировать на данные от родительской команды.
- У Click есть подробная информация обо всех параметрах и командах, поэтому он может генерировать объединённые страницы справки для всей командной строки и помочь пользователю при необходимости преобразовать входные данные.
- Click хорошо понимает типы данных и может предоставлять пользователю согласованные сообщения об ошибках в случае возникновения проблем. Подкоманда, написанная другим разработчиком, не внезапно завершит работу с другим сообщением об ошибке, потому что она обработана вручную.
- У Click достаточно метаданных, чтобы вся программа могла эволюционировать и улучшать пользовательский опыт со временем, не заставляя разработчиков изменять свои программы. Например, если Click решит изменить формат страниц справки, все программы Click автоматически получат от этого выгоду.
Цель Click — создавать композируемые системы. В то время как цель Docopt — создавать самые красивые и тщательно разработанные интерфейсы командной строки. Эти две цели конфликтуют друг с другом тонкими способами. Click активно препятствует реализации определённых шаблонов для достижения единого интерфейса командной строки. Например, как разработчик, вы имеете очень мало выбора при форматировании ваших страниц справки.
Почему жёстко заданные поведения?
Другой вопрос заключается в том, почему Click отходит от optparse и жёстко задаёт определённые поведения, вместо того, чтобы оставаться настраиваемыми. Есть несколько причин для этого. Самая главная заключается в том, что слишком большая настраиваемость затрудняет достижение согласованного пользовательского опыта командной строки.
Лучший пример для этого — функциональность optparse callback для принятия произвольного количества аргументов. Из-за синтаксических неоднозначностей в командной строке нет способа реализовать полностью вариативные аргументы. Всегда есть компромиссы, которые необходимо сделать, и в случае с argparse эти компромиссы были достаточно критическими, что систему вроде Click даже нельзя реализовать поверх неё.
В этом конкретном случае Click пытается придерживаться небольшого количества принятых парадигм для создания интерфейсов командной строки, которые можно хорошо документировать и тестировать.
Почему нет автоматической коррекции?
Возникал вопрос, почему Click не выполняет автоматическую коррекцию параметров, учитывая, что даже optparse и argparse поддерживают автоматическое расширение длинных аргументов. Причина в том, что это потенциальная проблема обратной совместимости. Если люди начнут полагаться на автоматически изменённые параметры, и кто-то добавит новый параметр в будущем, сценарий может перестать работать. Такие проблемы трудно обнаружить, поэтому Click не пытается быть магическим в этом отношении.
Однако такое поведение можно реализовать на более высоком уровне, чтобы поддержать такие вещи, как явные алиасы. Для получения дополнительной информации см. Командные алиасы.
© Copyright 2014 Pallets.
Licensed under the BSD 3-Clause License.
We are not supported nor endorsed by Pallets.
https://click.palletsprojects.com/en/8.1.x/why/