Стабильный двоичный интерфейс приложения

Традиционно C API Python будет меняться с каждым релизом. Большинство изменений будут совместимы с исходным кодом, как правило, только путём добавления API, а не изменения существующего API или удаления 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, помечены как «Не являются частью ограниченного API»