use*_*262 7 c python python-c-extension
我刚刚开始使用Python C扩展,并且很好奇为什么可以从Python调用的C函数必须使用2个PyObject*参数并返回PyObject*.我写了以下"Hello World"扩展:
#include <Python.h>
static PyObject *
hello_world(PyObject *self, PyObject *noargs)
{
printf("Hello World\n");
return Py_BuildValue("");
}
// Module functions table.
static PyMethodDef
module_functions[] = {
{ "hello_world", hello_world, METH_NOARGS, "hello world method" },
{ NULL }
};
// This function is called to initialize the module.
PyMODINIT_FUNC
inittesty2(void)
{
Py_InitModule("testy2", module_functions);
}
Run Code Online (Sandbox Code Playgroud)
为什么我(特别是使用METH_NOARGS)不能使用以下hello_world方法:
static void
hello_world()
{
printf("Hello World\n");
}
Run Code Online (Sandbox Code Playgroud)
?
jog*_*pan 10
关于各种PyObject指针有几点要说.
返回类型所需的一个用于异常处理机制.具体来说,如果您的函数返回空指针,Python解释器将抛出异常.(您应该在调用其中一个PyErr_..函数来设置特定异常后才这样做.)
这也意味着每当你不想抛出异常时,你必须返回指向某个真实的指针PyObject.如果没有特别的东西你的函数应该返回,只需返回Py_None(最好使用Py_RETURN_NONE宏来使引用计数正确),或"真"(使用Py_RETURN_TRUE).
的第一个参数,PyObject *self指向功能从或到它所属的模块实例调用的对象.请注意,您定义的每个函数都是类方法或模块方法.没有完全独立的功能.
所述第二参数,PyObject *args指向函数的参数(其可以是一个元组或多个参数列表).你是正确的指出一个不带任何参数的函数不应该需要这个 - 而且,据我所知,你是对的.你不必定义它; 你可以简单地定义一个函数
static PyObject *PyMyClass_MyFunc(PyObject *self) {
/* ..do something.. */
Py_RETURN_TRUE;
}
Run Code Online (Sandbox Code Playgroud)
你仍然必须投这PyCFunction时候你把它变成了PyMethodDef为数据类型定义,但我相信,当你使用演员是安全的,只要METH_NOARGS标志.但请注意以下评论可能存在的风险.
最后,函数实际上可能有第三个参数,如下所示:
static PyObject *PyMyClass_Func(PyObject *self, PyObject *args, PyObject *kwds)
{
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
第三个参数用于命名的可选参数.在这种情况下,您也必须将函数指针强制转换为PyCFunction,但如果METH_KEYWORDS在方法表中为函数设置了右侧的flag(),那么它也是安全的.
| 归档时间: |
|
| 查看次数: |
2418 次 |
| 最近记录: |