安定 ABI (Stable Appliction Binary Interface)¶
伝統的に Python の C API はリリース毎に変更されます。多くの変更はソース互換性を保っていて、既存の API を変更したり取り除いたりすることはありません (ただし、いくつかの API は、一旦非推奨と指定された後に、削除されます)。
残念ながら API の互換性はバイナリレベルの互換性 (ABI) までには適用されません。その理由は主に、構造体フィールドの新規追加や型の変更によって、たとえ API は壊れなくても ABI は壊れてしまうからです。その結果として、拡張モジュールを Python のリリース毎に再コンパイルする必要があります (Unix でその影響を受けるインターフェイスが使用されていない場合は例外かもしれませんが)。また、 Windows では、何らかの pythonXY.dll とリンクしている拡張モジュールは、再コンパイルした後に新しい dll とリンクし直す必要があります。
Python 3.2 以降では、安定 ABI を保証するための API サブセットが宣言されています。拡張モジュールでこのAPI (“limited API” と呼ばれます) を使うには Py_LIMITED_API
を定義してください。拡張モジュールの細部は大部分隠蔽され、代わりに再コンパイルなしにバージョン 3.x (x>=2) 上で動くモジュールがビルドされます。
いくつかのケースでは、安定 ABI を新しい関数で拡張する必要があります。これらの新しい API を使用したい拡張モジュールは、 Py_LIMITED_API
にサポートしたい最小の Python バージョンの PY_VERSION_HEX
の値 (API と ABI のバージョニング を参照) を設定してください。 (例えば Python3.3 なら 0x03030000
)。 モジュールは後続のすべての Pythonリリースで動作しますが、 (シンボルが存在しないため) 古いリリースでは動作しません。
Python 3.2 からは limited API は PEP 384 に文書化されています。 C API のドキュメントでは、 limited API の一部でない API は、 “Not part of the limited API” とマークされています。