首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PyMethodDef数组需要包含多个NULL的哨兵元素?

为什么PyMethodDef数组需要包含多个NULL的哨兵元素?
EN

Stack Overflow用户
提问于 2017-04-12 14:01:42
回答 1查看 861关注 0票数 4

几个Python结构似乎需要一个哨兵(可能是为了知道何时“停止”)。但是为什么有些像PyMethodDef的数组会用多个NULL初始化一个哨兵元素呢?

例如,zip

代码语言:javascript
复制
static PyMethodDef zip_methods[] = {
    {"__reduce__",   (PyCFunction)zip_reduce,   METH_NOARGS, reduce_doc},
    {NULL,           NULL}           /* sentinel */
};

为什么“哨兵数组”中的最后一个PyMethodDef有两个NULL?为什么不只是一个?或者考虑到__reduce__有4个条目,为什么不将4个NULLs作为前哨元素呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 12:22:12

我不认为是这样。原因有二:

1)在Python源代码中,它只检查名称和NULL。

据我所知,PyMethodDef数组在两处使用:将方法附加到类型时,以及将方法附加到模块时。

要找到相关的代码,首先要注意所有类型都通过PyType_Ready,大多数模块通过PyModule_Init,所以在那里开始搜索。PyModule_Create转发给PyModule_Create2。在PyType_Ready中,这些方法由内部函数add_methods处理。在PyModule_Create2中,所有调用都是对PyModule_AddFunctions的调用,这实际上是一个公共职能,如果您想自己做低级别的内容,那么它将调用内部函数_add_methods_to_object

这两个内部函数都有一个for循环来循环这些方法并将它们添加到相关的字典中。在两者都有 案例中,继续循环的条件是meth->ml_name!=NULL

因此,至少目前只检查名称。

2) 在C和C++中,部分初始化都保证其余字段为零/默认初始化。因此,只要将哨兵的第一个元素初始化为0,就可以确保所有其他元素都初始化为0。您甚至可以使用{}

(顺便提一句,Python在它定义的大型结构中经常使用这种自动零初始化,例如PyTypeObject,它很大,很少完全填充。)

写完这个答案后,我发现这里有已经讨论过了

总之- Python只检查ml_name (虽然这是一个实现细节,所以我猜将来如果他们用非NULL方法来使用NULL名称的话,可能会改变),而且C会自动将哨兵归零。我不知道为什么这个惯例似乎要设置两个要素,但是下面的惯例有一些话要说。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43371780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档