PyMODINIT_FUNC和PyModule_Create之间的区别

发布于 2021-01-29 16:08:48

如果我理解正确,

  1. Python 2.XPyModule_Create中的PyMODINIT_FUNC已在Python3.X中替换为
  2. 两者都返回PyObject*,但是,在Python 3.X中,模块的初始化函数 务必将 返回PyObject*给模块-即
    PyMODINIT_FUNC
    

    PyInit_spam(void)
    {
    return PyModule_Create(&spammodule);
    }

而在Python2.X中,这不是必需的-即

    PyMODINIT_FUNC
initspam(void)
{
  (void) Py_InitModule("spam", SpamMethods);
}

因此,我的健全性检查问题是:

  • 我的理解正确吗?
  • 为什么要进行此更改?

现在,我仅在试验非常简单的Python C扩展案例。也许如果我做更多的事情,答案很明显,或者如果我试图将Python嵌入其他东西中……。

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    1. 是的,您的理解是正确的。您必须从初始化函数返回新的模块对象,返回类型为PyMODINIT_FUNC。(PyMODINIT_FUNC声明该函数在python2中返回void,并在python3中返回PyObject *。)

    2. 我只能推测做出更改的人员的动机,但我相信这样做是为了可以更轻松地识别导入模块中的错误(如果出现问题,可以从python3中的module-init函数返回NULL。 )。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看