2014-10-24 3 views
2

Я пытаюсь написать расширение C++ для Python (3.x), что позволяет мне использовать специальный аппаратный экран для малины Pi.
У меня нет опыта написания C и/или C++, но, используя документацию на веб-сайте Python, я действительно начал работать. То, что я хотел бы сделать, это сделать мой тип Singleton, но если init-метод вернется с ошибкой (-1), второй вызов конструктора испортит ситуацию. Если init возвращается без ошибок, он работает, как и ожидалось.Python C++ extension Singleton

важные части моего кода:

static PyObject * 
MyType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
{ 
    static MyType *self = NULL; /* static to create a Singleton */ 

    if (self == NULL) { 
     self = (MyType *)type->tp_alloc(type, 0); 

     self->is_initialized = false; 
    } 
    else { 
     Py_XINCREF(self); 
    } 

    return (PyObject *)self; 
} 

static int 
MyType_init(MyType *self, PyObject *args, PyObject *kwds) 
{ 
    const char *i2c_addr; 

    self->rpi_model = RPI_MODEL_B; 
    self->enabled_components = COMPONENTS_ALL_BIT; 

    static char *kwlist[] = {"rpi_model", "enabled_components", NULL}; 

    if (self != NULL && !self->is_initialized) { 
     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &self->rpi_model, &self->enabled_components)) { 

      return -1; 
     } 
    } 

    /* 
     DO SOME INITIALIZATION STUFF 
    */ 

    if (!self->component_A->testConnection()) { 
     PyErr_SetString(InitializationException, "Unable to communicate with component_A."); 
     return -1; 
    } 

    self->is_initialized = true; 
    return 0; 
} 

Я также установили следующий Funtion в элементе tp_dealloc:

static void 
MyType_dealloc(PyObject *self) 
{ 
    Py_TYPE(self)->tp_free((PyObject*)self); 
} 

Я положил некоторые печати выписок по счетам в этих методах (для отладки) и кажется, что во втором вызове MyType_new, self != NULL, хотя метод MyType_dealloc был выполнен после сбоя инициализации.

Неужели кто-нибудь может указать мне в правильном направлении?

ответ

0

Похоже, что ваш MyType_dealloc не устанавливает self назад NULL.

Кроме того, вам не нужно иметь как __new__, так и __init__ - просто поместите все это в __new__.