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"*).
