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,并同时选择使 {}
不将数据归零。我会发现这不太可能。
我正在开发一个用 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,并同时选择使 {}
不将数据归零。我会发现这不太可能。