オブジェクトをヒープ上にメモリ確保する

PyObject *_PyObject_New(PyTypeObject *type)
Return value: New reference.
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
Return value: New reference.
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
Return value: Borrowed reference. Part of the Stable ABI.

新たにメモリ確保されたオブジェクト op に対し、型と初期状態での参照 (initial reference) を初期化します。初期化されたオブジェクトを返します。type からそのオブジェクトが循環参照ガベージ検出の機能を有する場合、検出機構が監視対象とするオブジェクトのセットに追加されます。オブジェクトの他のフィールドには影響を及ぼしません。

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
Return value: Borrowed reference. Part of the Stable ABI.

PyObject_Init() の全ての処理を行い、可変サイズオブジェクトの場合には長さ情報も初期化します。

PyObject_New(TYPE, typeobj)

C の構造体型 TYPE と Python の型オブジェクト typeobj ( PyTypeObject* ) を用いて Python オブジェクトの領域を新規確保します。Python のオブジェクトヘッダに定義されていないフィールドは初期化されません。呼び出し元がオブジェクトへの唯一の参照を持ちます(つまり、参照カウントは1になります)。メモリ割り当ての大きさは型オブジェクトの tp_basicsize フィールドによって定められます。

PyObject_NewVar(TYPE, typeobj, size)

C の構造体型 TYPE と Python の型オブジェクト typeobj ( PyTypeObject* ) を用いて Python オブジェクトの領域を新規確保します。Python のオブジェクトヘッダに定義されていないフィールドは初期化されません。確保されたメモリには、 TYPE 構造体に加え、 typeobjtp_itemsize フィールドによって定められた大きさのフィールドを size ( Py_ssize_t ) 個分格納できます。これはタプルなどの、生成時に大きさを決定できるオブジェクトを実装する際に便利です。同じメモリ割当にフィールドの配列も埋め込むことで、メモリ割当の回数を減らし、メモリ管理効率を上げることができます。

void PyObject_Del(void *op)

PyObject_New または PyObject_NewVar によって、オブジェクトのために確保されたメモリを解放します。これは通常オブジェクトの型に指定されている tp_dealloc ハンドラから呼び出されます。これの呼び出し後のメモリは既に有効な Python オブジェクトではなくなっているため、オブジェクトのフィールドはアクセスされるべきではありません。

PyObject _Py_NoneStruct

Python からは None に見えるオブジェクトです。この値へのアクセスは、このオブジェクトへのポインタを評価する Py_None マクロを使わなければなりません。

参考

PyModule_Create()

拡張モジュールのアロケートと生成。