尝试为 python 创建新类型
Trying to create a new type for python
我正在尝试为 python (2.5) 创建一个新类型。
我正在尝试遵循:python's documentation,但是我无法编译基本位:
#include <Python.h>
typedef struct {
PyObject_HEAD
/* Type-specific fields go here. */
} noddy_NoddyObject;
static PyTypeObject noddy_NoddyType = {
PyVarObject_HEAD_INIT(NULL, 0)
"noddy.Noddy", /* tp_name */
sizeof(noddy_NoddyObject), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"Noddy objects", /* tp_doc */
};
static PyMethodDef noddy_methods[] = {
{NULL} /* Sentinel */
};
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC
initnoddy(void)
{
PyObject* m;
noddy_NoddyType.tp_new = PyType_GenericNew;
if (PyType_Ready(&noddy_NoddyType) < 0)
return;
m = Py_InitModule3("noddy", noddy_methods,
"Example module that creates an extension type.");
Py_INCREF(&noddy_NoddyType);
PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType);
}
我得到:
18: error: initializer element is not constant
18: error: (near initialization for `ConnectionType.ob_refcnt')
18: error: parse error before string constant
18: warning: initialization makes pointer from integer without a cast
34: warning: initialization makes pointer from integer without a cast
35: warning: initialization from incompatible pointer type
这些行与类型定义中不为 0 的行相匹配。
我究竟做错了什么? python 版本有问题吗? (文档说这适用于 2.2+)。我搞砸了复制粘贴吗?
错误 文档是这里的关键。 Python 2.5 没有 PyVarObject_HEAD_INIT
宏。相反,它被假定为隐式函数声明和对函数的调用,其 return 值用于初始化结构成员;这也不是 终止的 表达式,它会导致 "parse error before string constant",因为 ,
不见了。
关注Python 2.5 documentation for Python 2.5:
static PyTypeObject noddy_NoddyType = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"noddy.Noddy", /*tp_name*/
P.s。您可能想考虑在编译器命令行中添加一些额外的警告标志...
我正在尝试为 python (2.5) 创建一个新类型。 我正在尝试遵循:python's documentation,但是我无法编译基本位:
#include <Python.h>
typedef struct {
PyObject_HEAD
/* Type-specific fields go here. */
} noddy_NoddyObject;
static PyTypeObject noddy_NoddyType = {
PyVarObject_HEAD_INIT(NULL, 0)
"noddy.Noddy", /* tp_name */
sizeof(noddy_NoddyObject), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"Noddy objects", /* tp_doc */
};
static PyMethodDef noddy_methods[] = {
{NULL} /* Sentinel */
};
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC
initnoddy(void)
{
PyObject* m;
noddy_NoddyType.tp_new = PyType_GenericNew;
if (PyType_Ready(&noddy_NoddyType) < 0)
return;
m = Py_InitModule3("noddy", noddy_methods,
"Example module that creates an extension type.");
Py_INCREF(&noddy_NoddyType);
PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType);
}
我得到:
18: error: initializer element is not constant
18: error: (near initialization for `ConnectionType.ob_refcnt')
18: error: parse error before string constant
18: warning: initialization makes pointer from integer without a cast
34: warning: initialization makes pointer from integer without a cast
35: warning: initialization from incompatible pointer type
这些行与类型定义中不为 0 的行相匹配。 我究竟做错了什么? python 版本有问题吗? (文档说这适用于 2.2+)。我搞砸了复制粘贴吗?
错误 文档是这里的关键。 Python 2.5 没有 PyVarObject_HEAD_INIT
宏。相反,它被假定为隐式函数声明和对函数的调用,其 return 值用于初始化结构成员;这也不是 终止的 表达式,它会导致 "parse error before string constant",因为 ,
不见了。
关注Python 2.5 documentation for Python 2.5:
static PyTypeObject noddy_NoddyType = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"noddy.Noddy", /*tp_name*/
P.s。您可能想考虑在编译器命令行中添加一些额外的警告标志...