Зачем этот цикл

В программировании вообще и в питоне в частности я отношу себя к категории "понаехавших". Однажды, присутствуя на защите проектов студентами, которые стажировались в нашей организации, я услышал что-то вроде: "Наш проект написан на языке Python, это достаточно простой язык...". Эти слова были сродни удару молнии. Что? "Достаточно простой язык программирования"? Простой и программирование — эти слова могут сочетаться? В тот же вечер я решил проверить... И больше с питоном не расставался. Студент не приукрасил. Нет, конечно, потом-то я понял, что далеко не всё так просто и радужно, но на этапе первоначального знакомства всё действительно выглядело очень доступно.

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

Пока замысел в том, чтобы написать о 10 программистах, чьи имена не особо примелькались, но чьи заслуги невозможно переоценить. Начну я этот цикл с Эндрю Кучлинга (A.M. Kuchling). Я всегда знал его как автора официального туториала по регуляркам в питоне, пожалуй, лучшего по этой теме. Но масштаб этого человека куда больше.

Летопись Python

В 2000-м Кучлинг сделал нечто простое, но очень важное: написал статью "What's New in Python 2.0". Живой рассказ о том, что изменилось в языке и почему, с примерами, с объяснениями решений, с контекстом. Эту серию он вёл вплоть до релиза Python 2.7 в 2010-м.

Именно Кучлинг сформировал культуру того, как питон рассказывает о самом себе. К тому времени, когда Кучлинг перестал писать эти статьи, они стали нормой, и выходят по сей день. Когда заглянете в описание новинок в Python 3.15, вспомните о том, кто стоял у истоков таких описаний.

Единый интерфейс для разных реализаций

В начале 2000-х в Python было несколько модулей для криптографического хеширования: MD5, SHA и другие. Каждый работал по-своему. Если хочешь переключиться с одного на другой, надо переписывать код.

В марте 2001-го Кучлинг опубликовал PEP 247.

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

4 метода, new(), update(), digest(), hexdigest(), и 1 атрибут digest_size. Всё.

Этот интерфейс лёг в основу модуля hashlib, который появился в Python 2.5 и живёт до сих пор. Каждый раз, когда пишем hashlib.md5().hexdigest(), используем интерфейс, спроектированный Кучлингом в 2001-м.

Тот же подход к унификации интерфейса Кучлинг продемонстрировал в PEP 272, на этот раз применительно к шифрованию.

В этом PEP, кстати, есть забавный фрагмент:

plaintext = "Guido van Rossum is a space alien."
obj.encrypt(plaintext)
# ValueError: Strings for DES must be a multiple of 8 in length

Сборка без боли

До 2000 года собрать Python из исходников означало вручную редактировать файл Modules/Setup: найти где установлены все требуемые библиотеки, прописать путь, раскомментировать нужные строки. Обновил Python, начинай сначала.

Кучлинг писал в PEP 229:

"Людям приходится помнить, какие строки в Modules/Setup нужно раскомментировать. Перенос Setup на новую версию Python — это морока. Пользователи сами должны разбираться, куда установлены нужные библиотеки."

Решение было предложено такое: использовать уже существующий модуль distutils, пусть он сам находит библиотеки в системе и компилирует всё возможное.

Да, distutils уже нет в питоне (удален в версии 3.12), но идея автообнаружения зависимостей никуда не делась. Реализации умирают, концепции остаются.

Паспорт пакета

В марте 2001 года Кучлинг опубликовал PEP 241 "Metadata for Python Software Packages".

Экосистема Python тогда напоминала библиотеку без каталога. Пакеты существовали, люди ими делились, но единого способа описать пакет не было. Кто автор? Под какой лицензией? Для каких платформ?

Кучлинг предложил простую вещь: файл PKG-INFO в формате RFC 822 (почтовых заголовков). Имя, версия, лицензия, описание, email автора. Парсер для такого формата уже был в стандартной библиотеке, никаких новых зависимостей не требовалось.

Адрес электронной почты Кучлинг предложил сделать обязательным полем и пояснил:

Это поле не является необязательным, потому что каталоги могут использовать email как уникальный ключ для идентификации автора.

"Каталоги" — это и есть прообраз PyPI (официальный репозиторий Python-пакетов). Чтобы каталог пакетов работал, нужен уникальный идентификатор автора. Адрес электронной почты самый очевидный кандидат.

PyPI появился через пару лет, в 2003, и опирался именно на метаданные, которые Кучлинг описал в PEP 241.

PEP 241 давно помечен как "замененный". Его заменил PEP 314 и далее по цепочке вплоть до современного pyproject.toml. Но идея машиночитаемого паспорта пакета никуда не делась.

$ head -6 lib/python3.12/site-packages/fastapi-0.135.1.dist-info/METADATA
Metadata-Version: 2.4
Name: fastapi
Version: 0.135.1
Summary: FastAPI framework, high performance, easy to learn, fast to code, ready for production
Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
License-Expression: MIT

Это часть файла METADATA из установленного FastAPI. Прямой потомок PKG-INFO из PEP 241. Те же поля, та же идея, только формат немного эволюционировал за 24 года. Но паспорт пакета, придуманный Кучлингом, никуда не делся.

На этом на сегодня всё. В следующей заметке поговорим о Ричарде Джонсе, человеке, который построил то, что сегодня называется PyPI.