的只說這對PyModule_Create
:由PyModule_Create'borrowed'或'acquired'返回PyObject *嗎?
模塊初始化函數可以創建和直接返回模塊對象。這被稱爲「單相初始化」,並採用下面的兩個模塊創建功能之一:
PyObject* PyModule_Create(PyModuleDef *def)
- 創建一個新的模塊對象,鑑於DEF定義。這與
PyModule_Create2()
的行爲相似,module_api_version設置爲PYTHON_API_VERSION
。- ...
之前,它是從初始化函數返回時,生成的模塊對象是使用像
PyModule_AddObject()
功能通常填充。
另外,PyModule_Create
不在this question的列表中。這將表明正在遵循傳統行爲,即呼叫者有望'獲得'被返回的參考PyObject*
。
但還沒有從這個python3porting博客文章,它有下面的例子:
static PyObject *
moduleinit(void)
{
MOD_DEF(m, "themodulename",
"This is the module docstring",
module_methods)
if (m == NULL)
return NULL;
if (PyModule_AddObject(m, "hookable",
(PyObject *)&hookabletype) < 0)
return NULL; /* line A */
return m;
}
將「A線」不漏此代碼路徑的參考?什麼是PyModule_Create
的正確使用和所有權語義?
好的,這是有道理的。因此,如果您需要發信號通知模塊加載錯誤*但PyModule_Create已成功,則需要使用'Py_DECREF(m)'? – greatwolf
@greatwolf:是的。 – user2357112