代码之家  ›  专栏  ›  技术社区  ›  cdvv7788

尝试为python创建新类型

  •  -1
  • cdvv7788  · 技术社区  · 7 年前

    我正在尝试为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的行匹配。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Antti Haapala -- Слава Україні    7 年前

    这个 错误的 PyVarObject_HEAD_INIT 宏。相反,它被假设为隐式函数声明和对函数的调用,其返回值用于初始化结构成员;这也不是一个 结束 表达式,导致 ,因为 , 缺少。

    Python 2.5 documentation for Python 2.5

    static PyTypeObject noddy_NoddyType = {
        PyObject_HEAD_INIT(NULL)
        0,                         /*ob_size*/
        "noddy.Noddy",             /*tp_name*/