Interfaz binaria de aplicación estable¶
Tradicionalmente, la API en C de Python cambiará con cada lanzamiento. La mayoría de los cambios serán compatibles con la fuente, generalmente solo agregando API, en lugar de cambiar la API existente o eliminar la API (aunque algunas interfaces se eliminan después de ser desaprobadas primero).
Desafortunadamente, la compatibilidad API no se extiende a la compatibilidad binaria (el ABI). La razón es principalmente la evolución de las definiciones de estructura, donde la adición de un nuevo campo, o el cambio del tipo de campo, puede no romper la API, pero puede romper la ABI. Como consecuencia, los módulos de extensión deben volver a compilarse para cada versión de Python (aunque es posible una excepción en Unix cuando no se utiliza ninguna de las interfaces afectadas). Además, en Windows, los módulos de extensión se vinculan con un pythonXY.dll específico y deben recompilarse para vincularse con uno más nuevo.
Desde Python 3.2, se ha declarado un subconjunto de la API para garantizar un ABI estable. Los módulos de extensión que deseen utilizar esta API (llamada «API limitada») deben definir Py_LIMITED_API
. Varios detalles del intérprete se ocultan del módulo de extensión; a cambio, se construye un módulo que funciona en cualquier versión 3.x (x> = 2) sin recompilación.
En algunos casos, el ABI estable debe ampliarse con nuevas funciones. Los módulos de extensión que deseen utilizar estas nuevas API deben establecer Py_LIMITED_API
en el valor PY_VERSION_HEX
(ver Versiones de API y ABI) de la versión mínima de Python que desean admitir (por ejemplo,``0x03030000`` para Python 3.3). Dichos módulos funcionarán en todas las versiones posteriores de Python, pero no se cargarán (debido a la falta de símbolos) en las versiones anteriores.
A partir de Python 3.2, el conjunto de funciones disponibles para la API limitada se documenta en PEP 384. En la documentación de la API de C, los elementos de la API que no forman parte de la API limitada se marcan como «No forma parte de la API limitada».