[Kotobank::most] Pack: one step closer to nowadays for python

1 2017-09-04 17:00 Проблема существует

Надеюсь, ни для кого не секрет, что экосистема вокруг питона представляет собой набор неудобных утилит поверх наслоения легаси-отложений. Для того, чтобы сделать тестовый проект (первый!), придётся разобраться с пипом и виртуаленвом уже тогда, когда часть кода оформится в первый пакет.

Вероятно, для создания скелета приложения и запуска кода и тестов людям хватает инструментов, встроенных в PyCharm, но что же делать тем, кто использует другие IDE? Как мне кажется, инструменты для создания скелета репозитория, базовой его настройки (генерации .git/config, файла с описанием зависимостей из которого, например, можно генерировать setup.py), запуска тестов, генерации документации и прочих повседневных полезных вещей должны существовать отдельно от IDE и иметь для них плагин-враппер.

Ещё полезная фича для больших фреймворков – это генерация скелета приложения по шаблону, но к сожалению знания о шаблонах есть в этих самих фреймворках. То есть разработчик должен сначала настроить окружение, потом поставить, например, Django, затем позвать их утилиту, которая сгенерирует структуру репозитория и начальное приложение, которое надо запустить отдельной командой, и уже тогда можно посмотреть на результат.

На мой взгляд этими вещами должна заниматься одна утилита. Есть множество подобных утилит для других языков программирования, перечисленные ниже я потыкал сам:

  • leiningen для clojure
  • cargo для rust
  • stack для haskell

Они выполняют схожие функции для своих ЯП.

utility new [–bin or –lib] project-name [template-name] создаст скелет проекта, либо для приложения, либо для библиотеки. Если указать шаблон, то будет сгенерирован проект по шаблону, например lein new myapp luminus создаст проект похожий на начальный проект для Django. Можно сразу его запустить командой lein run и сходив на указанный порт в конфиге потыкать работающий пример.

Так же у этих трёх утилит есть команды для запуска тестов, REPL в проекте, генерации документации, обновления зависимостей и публикации проекта в своих репозиториях.

Конечно, всё это можно сделать и самому, но это второстепенные задачи и тратить время на них из проекта в проект не слишком рационально.

Итак, проблему я осветил, она существует и почему-то комьюнити закрывает на неё глаза. Есть пара заброшенных проектов на гитхабе и всё. Пора начинать новый проект, надеюсь последний, в котором всё придётся делать руками.

╰─$ mkdir pack && cd pack && git init && touch setup.py Makefile README.rst requirements.txt 
Initialized empty Git repository in /home/most/pack/.git/

Stay in touch.

2 2017-09-11 18:30 Осколки инфраструктуры существуют

Сперва надо изучить то, что есть в комьюнити, может удастся что-то использовать или предоставить плагин для интеграции.

Есть несколько распространённых утилит и технологий для работы с пакетами, окружениями, тестами и документацией.

2.1 Packages

  • pip – ну а куда без него. Пакетный менеджер, который не умеет в update. Если так хочется обновить – будте добры там pip freeze, xargs, pip –upgrade install туда-сюда. requirements.txt прикольная штука, но всё равно кейсов всех не покрывает. В комьюнити постоянно происходят холивары на тему как всем этим зоопарком пользоваться. Достойное занятие вместо того чтобы перенять удачные концепции манифеста и локов у утилит других ЯП. Например хаскеля или раста. Зависимости можно держать как в requirements.txt, так и в setup.py. При этом всякие сишные модули и прочие вещи, выходящие за рамки обычной питоньей либы можно объявить только в setup.py. При этом людям приходится писать там приличное количество кода. Удобно, чо. Собственно, есть позиция, предписывающая держать версии в requirements.txt, получать их pip freeze из окружения с проходящими тестами, например. То есть это lockfile, по сути, который не надо трогать руками. Ну тогда, его должен генерировать пакетный менеджер по манифесту. Сплошные инкосистенции.

    По делу же, pip использовать придётся и хорошо бы закрыть все эти безумные дыры. Наверняка, для поддержки установки проекта пипом придётся генерировать большой setup.py, значит бойлерплейт, дополняющий функциональность аутсайдера пакетных менеджеров надо куда-то положить отдельно что-ли. Мы же тут упростить вещи хотим.

  • pbr – насколько знаю, утилита, позволяющая вынести то что передаётся в setup.py кваргами в отдельный файл (setup.ini). Шёл 2к17, а питонисты продолжали использовать INI. pbr использует openstack, вроде его девелоперы его и написали (pbr то-бишь, опенстек впрочем тоже).
  • wheels – возможность редистрибуции кроссплатформенных пакетов для cpython. Не знаю, насколько это полезно. Надо потыкать и расписать поболее.

2.2 Environments

  • virtualenv – скриптики на баше для создания иерархии директорий и проноса в них правильных симлинков. Полезно, вкусно, но надоело уже делать каждый раз это всё руками. Неужели кого-то прёт вообще подобное.
  • virtualenvwrapper – насколько знаю это набор чуть более удобных утилит поверх virtualenv для того чтобы впроще было делать это всю рутину руками. Опять же, руками. Надо потыкать да обновить вот это всё сверху.
  • pyenv – тоже тулза для жонглирования окружениями, но вроде как умеет ставить интерпретаторы сама. Нужно изучить и расписать.

2.3 Tests

  • tox – cross-environment запускатор разных задач, в основном используется для тестирования в окружении различных питонов. Довольно мало знаю про него, надо потыкать получше и расписать.
  • pytest – безумный фреймворк для написания тестов на стероидах. Хакабл до самых низов. Определённо следует изучить и сделать интеграцию.
  • nosetest – ну какой-то запускатор тестов и фреймворк. Вроде не представляет интереса поскольку есть pytest.
  • unittest – Junit-like фреймворк, а значит кругом классы, методы. Громоздко. Безусловный плюс – поставка в стандартной библиотеке. У pytest имеется интеграция с unittest, что удобно для написания иерархии кастомных тесткейсов, если требуется предоставить определённые моки и делать какие-то вещи на старте и стопе каждого кейса, например, поднятие реальной базы. Да, это получаются уже не юнит-тесты, а функциональные, ну и что?
  • pylint – крутой и доставучий статический анализатор. Имеет плагин к pytest. Обладает здоровенным конфигом.

2.4 Documentation

  • sphinx – безусловно одна из крутейших систем документирования кода. Имеет свою утилиту для генерации начальной документации с интерактивным режимом. Определённо стоит делать интеграцию, так как это де-факто стандарт документации для питоньих проектов. Других я, впрочем, не видел.

Этот зоопарк до создания проекта надо привезти на хост. Этот зоопарк надо обновлять. Утилиты ещё должны быть заменяемыми. Проекты ещё должны мочь собираться и устанавливаться и проч. без оркестрации и СМС, отдельно утилитами.

3 2017-09-12 17:00 Различные реализации существуют

Стоит напомнить о том, что Python это язык программирования, а не его реализация. Де-факто стандартом и реализацией языка Python является CPython, довольно медленный и не самый фичастый интерпретатор, которым пользуются большинство python-программистов. Насколько я понял, интерпретатор CPython концептуально остался в поздних 60-x, не привнеся ничего нового. Но есть и другие реализации языка Python, которые могут предложить компиляцию в машинный код, JIT, систему типов с автоматическим выводом типов Хиндли-Милнера, компиляцию в байт-код для JVM и прочие прелести.

3.1 CPython

Стандартная реализация, первый интепретатор Python, разрабатывается PSF и разработчики остальных интерпретаторов вынуждены поддерживать совместимость с ним на уровне синтаксиса. Написан на С, предоставляет С/Python API, через него же реализована часть стандартной библиотеки и биндинги для сишных либ типа curses.

Перечисленные в предыдущем посте тулзы заточены именно под эту реализацию, работоспособность их для других интерпретаторов и возможность установки мне пока неизвестна.

3.2 Pyston

Интерпретатор Python с JIT-компилятором, разработанный в Dropbox. По какой-то причине рождён мёртвым и выброшен на гитхаб для дальнейшей гальванизации. Надеюсь с ним всё будет хорошо.

3.3 Cython

Компилятор Python в С и С++.

3.4 PyPy

Альтернативная реализация Python на Python (RPython) и тулчейн для создания эффективных интерпретаторов. Поддерживается Mozilla, которая нормально так вливает в него деньги. Старается успевать за новыми релизами CPython и в последнее время ему это удаётся. Имеет JIT-компилятор, который может выдавать значительный прирост относительно CPython в том случае если код работает достаточно долго чтобы JIT успел прогреться. Имеет проблемы с распространёнными библиотеками и фреймворками, типа Tornado и asyncio, а также высокий порог входа. Для того чтобы писать код как минимум не медленнее CPython, нужно хорошо понимать как написана стандартная библиотека PyPy. В угоду совместимости с CPython там встречаются очень неэффективные вещи, про которые надо знать. Ребята из MailRu очень его любят и рассказывают на конференциях про эти подводные камни, респект.

3.5 RPython

Компилятор Python в С, JVM и CIL, используется при сборке PyPy. Позволяет вычислять типы во время компиляции.

3.6 Jython

Компилятор Python в байткод для JVM. Позволяет использовать Java-классы из питоньего кода.

3.7 IronPython

Компилятор Python в CLR. Реализован поверх DLR, части .NET Framework.

3.8 IPython

Ну это не сам интепретатор вроде, а только человеческий REPL к нему. До SLIME впрочем не дотягивает. Но там всякие удобные вещи типа мультилайна, хистори, автодополнения нормального, удобного хелпа вплоть до сорцов. Запускать REPL в проекте тоже задача будущего Pack, поэтому указал его здесь.