膠囊?
有關使用這些對象的更多信息請參閱 給擴展模塊提供C API。
3.1 新版功能.
-
PyCapsule? 這個
PyObject的子類型代表著一個任意值,當需要通過 Python 代碼將任意值(以void*指針的形式)從 C 擴展模塊傳遞給其他 C 代碼時非常有用。它通常用于將指向一個模塊中定義的 C 語言函數指針傳遞給其他模塊,以便可以從那里調用它們。這允許通過正常的模塊導入機制訪問動態加載的模塊中的 C API。
-
PyCapsule_Destructor? 這種類型的一個析構器返回一個膠囊,定義如下:
typedef void (*PyCapsule_Destructor)(PyObject *);
參閱
PyCapsule_New()來獲取 PyCapsule_Destructor 返回值的語義。
-
PyObject*
PyCapsule_New(void?*pointer, const char?*name, PyCapsule_Destructor?destructor)? - Return value: New reference.
創建一個封裝了 pointer 的
PyCapsule。 pointer 參考可以不為NULL。在失敗時設置一個異常并返回
NULL。字符串 name 可以是
NULL或是一個指向有效的 C 字符串的指針。 如果不為NULL,則此字符串必須比 capsule 長(雖然也允許在 destructor 中釋放它。)如果 destructor 參數不為
NULL,則當它被銷毀時將附帶 capsule 作為參數來調用。如果此 capsule 將被保存為一個模塊的屬性,則 name 應當被指定為
modulename.attributename。 這將允許其他模塊使用PyCapsule_Import()來導入此 capsule。
-
void*
PyCapsule_GetPointer(PyObject?*capsule, const char?*name)? 提取保存在 capsule 中的 pointer。 在失敗時設置一個異常并返回
NULL。name 形參必須與保存在 capsule 中的名稱進行精確比較。 如果保存在 capsule 中的名稱為
NULL,則傳入的 name 也必須為NULL。 Python 會使用 C 函數strcmp()來比較 capsule 名稱。
-
PyCapsule_Destructor
PyCapsule_GetDestructor(PyObject?*capsule)? 返回保存為 capsule 中的當前析構器。 在失敗時設置一個異常并返回
NULL。具有
NULL析構器是合法的。 這會使得NULL返回值有些歧義;請使用PyCapsule_IsValid()或PyErr_Occurred()來消除歧義。
-
void*
PyCapsule_GetContext(PyObject?*capsule)? 返回保存在 capsule 中的當前上下文。 在失敗時設置一個異常并返回
NULL。capsule 具有
NULL上下文是全法的。 這會使得NULL返回碼有些歧義;請使用PyCapsule_IsValid()或PyErr_Occurred()來消除歧義。
-
const char*
PyCapsule_GetName(PyObject?*capsule)? 返回保存在 capsule 中的當前名稱。 在失敗時設置一個異常并返回
NULL。capsule 具有
NULL名稱是合法的。 這會使得NULL返回碼有些歧義;請使用PyCapsule_IsValid()或PyErr_Occurred()來消除歧義。
-
void*
PyCapsule_Import(const char?*name, int?no_block)? 從一個模塊的 capsule 屬性導入指向 C 對象的指針。 name 形參應當指定屬性的完整名稱,與
module.attribute中的一致。 保存在 capsule 中的 name 必須完全匹配此字符串。 如果 no_block 為真值,則以無阻塞模式導入模塊 (使用PyImport_ImportModuleNoBlock())。 如果 no_block 為假值,則以傳統模式導入模塊 (使用PyImport_ImportModule())。成功時返回 capsule 的內部 指針。 在失敗時設置一個異常并返回
NULL。
-
int
PyCapsule_IsValid(PyObject?*capsule, const char?*name)? 確定 capsule 是否是一個有效的。 有效的 capsule 必須不為
NULL,傳遞PyCapsule_CheckExact(),在其中存儲一個不為NULL的指針,并且其內部名稱與 name 形參相匹配。 (請參閱PyCapsule_GetPointer()了解如何對 capsule 名稱進行比較的有關信息。)換句話說,如果
PyCapsule_IsValid()返回真值,則任何對訪問器(以PyCapsule_Get()開頭的任何函數)的調用都保證會成功。如果對象有效并且匹配傳入的名稱則返回非零值。 否則返回
0。 此函數一定不會失敗。
-
int
PyCapsule_SetContext(PyObject?*capsule, void?*context)? 將 capsule 內部的上下文指針設為 context。
成功時返回
0。 失敗時返回非零值并設置一個異常。
-
int
PyCapsule_SetDestructor(PyObject?*capsule, PyCapsule_Destructor?destructor)? 將 capsule 內部的析構器設為 destructor。
成功時返回
0。 失敗時返回非零值并設置一個異常。
