在Python-2.7中,函数Py_InitModule4具有实验功能。
PyObject* Py_InitModule4(char *name, PyMethodDef *methods, char *doc, PyObject *self, int apiver);
文档说:
可悲的是他们没有问我 - 我用过它;-)。因此如果self为非NULL,则将传递给模块的函数 作为他们的(否则为NULL)第一个参数。 (这被添加为 实验性特征,目前尚无已知用途 Python版本。)
self
参数传递给PyMethodDef中定义的所有函数。我在嵌入式环境中使用此功能将结构传递给我的函数。此功能似乎在Python 3中不再存在,而self
现在的类型为PyModuleType
。我可以将数据隧道传输到我的函数的任何其他方式,最好不使用Python C API中的其他函数。
static PyObject * MyCustomFunction(PyObject *self, PyObject *args, ...)
// In Python 2 self could be set via Py_InitModule. What is the way to go in Python 3?
答案 0 :(得分:0)
Python 3.x中传递的self
到C函数的原始实现仍然存在于Python 3.x中。但是,代替自定义对象,函数所在的模块对象会自动传递。但是,底层PyCFunction仍然具有m_self
成员,可以用另一个对象替换(如果在if = = nullptr之前在C中执行m_self)。这只需要在Python 3中手动完成 - 在函数注册后。请参阅here。
typedef struct {
...
PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL
...
} PyCFunctionObject;
仅供参考:在Python本身,您甚至可以通过__self__
import math
print(math.sin.__self__) # prints: <module 'math' (built-in)