Я пытаюсь написать расширение 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 был выполнен после сбоя инициализации.
Неужели кто-нибудь может указать мне в правильном направлении?