Стабильный прикладной двоичный интерфейс¶
Традиционно 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».