Канон / R9 · корень

Совместимость как ограничение

После Python 3 ломать нельзя. Деталь реализации становится обещанием ровно тогда, когда на неё оперлось слишком много кода.

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

1Что произошло

Python 3 вышел в 2008 году и намеренно сломал совместимость. Главная причина была одна и она была правильной: строки и байты требовалось развести окончательно, а сделать это без слома невозможно. Заодно починили деление, печать, итераторы вместо списков в половине встроенных функций, привели в порядок стандартную библиотеку.

Миграция заняла двенадцать лет. Поддержка Python 2 закончилась в 2020-м, к тому моменту крупные проекты переходили годами, а некоторые не перешли никогда. Инструменты для автоматического перевода помогали лишь частично — семантика str и bytes различалась так, что машине приходилось угадывать.

2Чему это научило

Вывод, сделанный сообществом и зафиксированный на практике: ломать больше нельзя. Не «нежелательно», а нельзя — цена оказалась несопоставимой с любой выгодой от чистоты языка.

Отсюда всё, что видно сегодня:

3Главное следствие для читателя

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

Поэтому шкала твёрдости из этого канона — не педантизм, а рабочий инструмент: она отвечает на вопрос «сломается ли мой код на другой реализации или в следующем релизе», и на staff-уровне этот вопрос задают прямо.