PyModule_Create的元数据

时间:2018-02-23 05:04:08

标签: python python-2.7 python-3.6

在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?

1 个答案:

答案 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)