Стабильный интерфейс прикладного двоичного кода¶Stable Application Binary Interface
Традиционно C API Python изменяется с каждым выпуском. Большинство изменений совместимы на уровне исходного кода – обычно просто добавляются новые элементы API, а существующие не меняются и не удаляются (хотя некоторые интерфейсы удаляются после объявления устаревшими).
К сожалению, совместимость API не распространяется на двоичную совместимость (ABI). Основная причина – эволюция определений структур: добавление нового поля или изменение типа поля может не нарушить API, но может нарушить ABI. Как следствие, модули расширения необходимо перекомпилировать для каждого выпуска Python (хотя в Unix возможно исключение, если ни один из затронутых интерфейсов не используется). Кроме того, в Windows модули расширения связываются с конкретной библиотекой pythonXY.dll и требуют перекомпиляции для связывания с новой версией.
Начиная с Python 3.2, часть API объявлена гарантирующей стабильный ABI. Модули расширения, желающие использовать этот API (называемый «ограниченный API»), должны определить Py_LIMITED_API. Ряд деталей интерпретатора становятся скрытыми от модуля расширения; взамен создаётся модуль, который работает в любой версии 3.x (x>=2) без перекомпиляции.
В некоторых случаях стабильный ABI необходимо расширять новыми функциями. Модули расширения, желающие использовать эти новые API, должны установить Py_LIMITED_API в значение PY_VERSION_HEX (см. Версионирование API и ABI) минимальной версии Python, которую они хотят поддерживать (например, 0x03030000 для Python 3.3). Такие модули будут работать во всех последующих выпусках Python, но не смогут загрузиться (из-за отсутствующих символов) в более старых выпусках.
Начиная с Python 3.2, набор функций, доступных в ограниченном API, документирован в PEP 384. В документации C API элементы API, не входящие в ограниченный API, помечены как «Not part of the limited API».