Создайте экземпляр класса python, объявленный в python, с помощью C API

Я хочу создать экземпляр класса Python, определенного в области __main__, с помощью C API.

Например, класс называется MyClass и определяется следующим образом:

class MyClass:
    def __init__(self):
        pass

Тип класса находится в области видимости __main__.

В приложении C я хочу создать экземпляр этого класса. Это могло быть просто возможно с PyInstance_New, так как оно принимает имя класса. Однако эта функция недоступна в Python3.

Любая помощь или предложения по альтернативам приветствуются.

Спасибо, Пол.


person Paul    schedule 18.07.2009    source источник


Ответы (1)


Я считаю, что самый простой подход:

/* get sys.modules dict */
PyObject* sys_mod_dict = PyImport_GetModuleDict();
/* get the __main__ module object */
PyObject* main_mod = PyMapping_GetItemString(sys_mod_dict, "__main__");
/* call the class inside the __main__ module */
PyObject* instance = PyObject_CallMethod(main_mod, "MyClass", "");

плюс, конечно, проверка ошибок. Вам понадобится только DECREF instance, когда вы закончите с ним, две другие являются заимствованными ссылками.

person Alex Martelli    schedule 18.07.2009