c++扩展中的Python哨兵

Python sentinel in C++ extension

本文关键字:Python 哨兵 扩展 c++      更新时间:2023-10-16

我正在开发一个用c++编写的Python扩展模块。

根据Python文档,模块方法表应该这样写:

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
    "Execute a shell command."},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

但是我看到一些开发人员这样写哨兵:

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
    "Execute a shell command."},
    ...
    {}                          /* Sentinel */
};

我的问题是,使用缩写版本有风险吗?

{}初始化的pod类的字段没有显式设置为零。

如果PyMethodDef是pod(普通旧数据),我怀疑,{NULL, NULL, 0, NULL}将生成与{}相同的数据。

在C和c++中都是如此。

如果类PyMethodDef是c++ 11中的非pod类,那么{NULL, NULL, 0, NULL}可以做一些与{}不同的事情,但我强烈怀疑这里的情况。

我唯一关心的是,如果库改变了我,使PyMethodDef成为一个非pod,并选择使{}同时不为零数据。我觉得不太可能。