Python C++ 扩展中的哨兵

Python sentinel in C++ extension

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

根据Pythondocumentation模块方法table应该这样写:

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 class 具有未明确设置为零的字段。

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

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

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

我唯一担心的是,如果库对我进行了更改,使 PyMethodDef 成为非 Pod,并同时选择使 {} 不将数据归零。我会发现这不太可能。