カプセル¶
これらのオブジェクトの使い方については 拡張モジュールに C API を提供する を参照してください。
Added in version 3.1.
-
type PyCapsule¶
PyObjectのこのサブタイプは不透明な値を表します。 C 拡張モジュールから Python のコードを経由して別の C コードへ、不透明な値を void* ポインタとして渡すのに役立ちます。 あるモジュールで定義した C 関数ポインタを別のモジュールに公開するためによく使われます。 これにより、通常のインポートの仕組みを使って、動的にロードしたモジュールの C API にアクセスできます。
-
PyTypeObject PyCapsule_Type¶
- 次に属します: Stable ABI.
カプセルオブジェクトに対応する型オブジェクトです。 Python レイヤの
types.CapsuleTypeと同じオブジェクトです。
-
type PyCapsule_Destructor¶
- 次に属します: Stable ABI.
カプセルに対するデストラクタコールバック型. 次のように定義されます:
typedef void (*PyCapsule_Destructor)(PyObject *);
PyCapsule_Destructor コールバックの動作については
PyCapsule_New()を参照してください。
-
PyObject *PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI. Thread safety: Atomic.
pointer を格納する
PyCapsuleを作成します。 pointer 引数はNULLであってはなりません。失敗した場合、例外を設定して
NULLを返します。name 文字列は
NULLか、有効なC文字列へのポインタです。NULLで無い場合、この文字列は少なくともカプセルより長く生存する必要があります。(destructor の中で解放することは許可されています)destructor が
NULLで無い場合、カプセルが削除されるときにそのカプセルを引数として呼び出されます。このカプセルがモジュールの属性として保存される場合、 name は
modulename.attributenameと指定されるべきです。こうすると、他のモジュールがそのカプセルをPyCapsule_Import()でインポートすることができます。
-
void *PyCapsule_GetPointer(PyObject *capsule, const char *name)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
カプセルに保存されている pointer を取り出します。失敗した場合は例外を設定して
NULLを返します。name 引数は、カプセルに格納されている名前と完全に一致しなければなりません。 カプセルに格納されている名前が
NULLなら、渡す name もNULLでなければなりません。 Python はカプセル名の比較に C 関数strcmp()を使います。
-
PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
カプセルに保存されている現在のデストラクタを返します。失敗した場合、例外を設定して
NULLを返します。カプセルは
NULLをデストラクタとして持つことができます。従って、戻り値のNULLがエラーを指してない可能性があります。PyCapsule_IsValid()かPyErr_Occurred()を利用して確認してください。
-
void *PyCapsule_GetContext(PyObject *capsule)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
カプセルに保存されている現在のコンテキスト(context)を返します。失敗した場合、例外を設定して
NULLを返します。カプセルは
NULLをコンテキストとして持つことができます。従って、戻り値のNULLがエラーを指してない可能性があります。PyCapsule_IsValid()かPyErr_Occurred()を利用して確認してください。
-
const char *PyCapsule_GetName(PyObject *capsule)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
カプセルに保存されている現在の name を返します。失敗した場合、例外を設定して
NULLを返します。カプセルは
NULLを name として持つことができます。従って、戻り値のNULLがエラーを指してない可能性があります。PyCapsule_IsValid()かPyErr_Occurred()を利用して確認してください。
-
void *PyCapsule_Import(const char *name, int no_block)¶
- 次に属します: Stable ABI. Thread safety: Safe to call from multiple threads with external synchronization only.
モジュールのカプセル属性から、C オブジェクトへのポインタをインポートします。 name 引数には
module.attributeのような属性の完全名を指定してください。 カプセルに格納されている name は、この文字列と完全に一致する必要があります。この関数は name を
.で分割し、最初の要素をインポートします。 残りの要素は属性の検索でたどります。成功すると、カプセル内部の pointer を返します。 失敗すると例外を設定して
NULLを返します。注釈
name がサブモジュールやサブパッケージの属性を指す場合、属性の検索を成功させるには、 事前に別の方法 (例えば
PyImport_ImportModule()) でそのサブモジュールやサブパッケージをインポートしておく必要があります。バージョン 3.3 で変更: no_block は効果を持たなくなりました。
-
int PyCapsule_IsValid(PyObject *capsule, const char *name)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
capsule が有効なカプセルであるかどうかをチェックします。有効な capsule は、非
NULLで、PyCapsule_CheckExact()をパスし、非NULLなポインタを格納していて、内部の name が引数 name とマッチします。 (name の比較方法についてはPyCapsule_GetPointer()を参照)言い換えると、
PyCapsule_IsValid()が真を返した場合、どのアクセサ (PyCapsule_Getで始まる関数) を呼び出しても成功することが保証されます。オブジェクトが有効で name がマッチした場合に非
0を、それ以外の場合に0を返します。この関数は絶対に失敗しません。
-
int PyCapsule_SetContext(PyObject *capsule, void *context)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
capsule 内部のコンテキストポインタを context に設定します。
成功したら
0を、失敗したら例外を設定して非0を返します。
-
int PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
capsule 内部のデストラクタを destructor に設定します。
成功したら
0を、失敗したら例外を設定して非0を返します。
-
int PyCapsule_SetName(PyObject *capsule, const char *name)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
capsule 内部の name を name に設定します。name が非
NULLのとき、それは capsule よりも長い寿命を持つ必要があります。もしすでに capsule に非NULLの name が保存されていた場合、それに対する解放は行われません。成功したら
0を、失敗したら例外を設定して非0を返します。
-
int PyCapsule_SetPointer(PyObject *capsule, void *pointer)¶
- 次に属します: Stable ABI. Thread safety: Safe to call without external synchronization on distinct objects.
capsule 内部のポインタを pointer に設定します。pointer は
NULLであってはなりません。成功したら
0を、失敗したら例外を設定して非0を返します。