安定したアプリケーションバイナリインターフェイス—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/c-api/stable
移動先:案内検索

安定したアプリケーションバイナリインターフェイス

従来、PythonのCAPIはリリースごとに変更されます。 ほとんどの変更は、既存のAPIを変更したりAPIを削除したりするのではなく、通常はAPIを追加するだけでソース互換になります(ただし、一部のインターフェースは最初に非推奨になった後に削除されます)。

残念ながら、APIの互換性はバイナリ互換性(ABI)には及びません。 その理由は主に構造体定義の進化であり、新しいフィールドの追加やフィールドのタイプの変更はAPIを壊さないかもしれませんが、ABIを壊す可能性があります。 結果として、拡張モジュールはPythonリリースごとに再コンパイルする必要があります(ただし、影響を受けるインターフェイスが使用されていない場合、Unixでは例外が発生する可能性があります)。 さらに、Windowsでは、拡張モジュールは特定のpythonXY.dllとリンクしており、新しいモジュールとリンクするには再コンパイルする必要があります。

Python 3.2以降、安定したABIを保証するためにAPIのサブセットが宣言されています。 このAPI(「制限付きAPI」と呼ばれる)の使用を希望する拡張モジュールは、Py_LIMITED_APIを定義する必要があります。 その後、多くのインタプリタの詳細が拡張モジュールから隠されます。 その見返りとして、再コンパイルせずに任意の3.xバージョン(x> = 2)で動作するモジュールが構築されます。

場合によっては、安定したABIを新しい機能で拡張する必要があります。 これらの新しいAPIを使用する拡張モジュールは、Py_LIMITED_APIをサポートする最小のPythonバージョンのPY_VERSION_HEX値( APIおよびABIバージョン管理を参照)に設定する必要があります(例: 0x03030000 for Python 3.3)。 このようなモジュールは、後続のすべてのPythonリリースで機能しますが、古いリリースでは(シンボルが欠落しているため)ロードできません。

Python 3.2以降、制限付きAPIで使用できる関数のセットは、 PEP 384 に記載されています。 C APIドキュメントでは、制限付きAPIの一部ではないAPI要素は、「制限付きAPIの一部ではない」とマークされています。