ABI Stable¶
L'API C de Python change à chaque version. La majorité de ces changement n'affecte cependant pas la compatibilité du code source. Typiquement, des API sont ajoutées, mais ni modifiées ni supprimées (bien que certaines interfaces puissent être supprimées, après avoir d'abord été dépréciées).
Malheureusement, la compatibilité de l'API ne s'étend pas à une compatibilité binaire (l'ABI). L'évolution des structures en est la raison principale : l'ajout de nouveaux attributs, ou le changement du type d'un attribut peut ne pas casser l'API mais casser l'ABI. Par conséquent, les modules d'extension doivent être recompilés à chaque nouvelle version de Python (ce n'est exceptionnellement pas nécessaire sur Unix, si aucune des interfaces modifiées n'est utilisée). De plus, sous Windows, les modules d'extension sont liés à un pythonXY.dll spécifique, ils est donc nécessaire de les recompiler pour les lier au nouveau DLL.
Depuis Python 3.2 il est garanti qu'une certaine partie de l'API gardera une ABI stable. Les modules d'extension souhaitant utiliser cette API (Appellée "API limitée") doivent définir Py_LIMITED_API
. Des spécificités de l'interpréteur sont alors cachées au module, en contrepartie le module devient compatible avec toutes les versions de Python 3.x (x>=2) sans recompilation.
Dans certains cas, il est nécessaire d'étendre l'ABI stable avec de nouvelles fonctions. Les modules d'extension souhaitant utiliser ces nouvelles APIs doivent configurer Py_LIMITED_API
à la valeur Py_VERSION_HEX
correspondant à la plus ancienne version de Python qu'ils souhaitent supporter (voir Version des API et ABI, par exemple 0x03030000
pour Python 3.3). De tels modules fonctionneront dans toutes les versions ultérieures de Python, mais ne pourront pas se charger (dû à des symboles manquants) sur les versions plus anciennes.
Depuis Python 3.2, l'ensemble des fonctions exposées par l'API limitée est documentée dans la PEP 384. Dans la documentation de l'API C, les éléments ne faisant pas partie de l'API limitée sont notés "Ne faisant pas partie de l'API limitée" ("Not part of the limited API").