2016-02-07 11 views
0

Я пишу Python 3 C extension, где я хочу использовать MappingProxyType (from types import MappingProxyType). Из того, что я увидел в исходном коде Cpython, MappingProxyType написан на Python, а не на C.Импорт стандартной библиотеки Python из C

Как использовать этот тип из C? Я предполагаю, что должно быть что-то вроде «импорта» уровня C, и тогда я мог бы найти PyObject (вернее, PyTypeObject) от имени в виде строки C.

ответ

1

Для импорта модулей имеется C API. Тогда вам просто нужно получить атрибут MappingProxyType типа из модуля:

static PyTypeObject *import_MappingProxyType(void) { 
    PyObject *m = PyImport_ImportModule("types"); 
    if (!m) return NULL; 
    PyObject *t = PyObject_GetAttrString(m, "MappingProxyType"); 
    Py_DECREF(m); 
    if (!t) return NULL; 
    if (PyType_Check(t)) 
     return (PyTypeObject *) t; 
    Py_DECREF(t); 
    PyErr_SetString(PyExc_TypeError, "not the MappingProxyType type"); 
    return NULL; 
} 
+0

Вы забыли проверить на наличие ошибок на GetAttr. На практике это вряд ли потерпит неудачу, но кто-то мог бы обезглавить модуль. – Kevin

+0

@ Кевин не надо. Если 't'' 'NULL', функция просто возвращает' NULL'. 't' никогда не используется, поэтому это безопасно. – tynn

+0

И что, если 't'' '' '' 'или что-то, что не является' PyTypeObject'? – Kevin

Смежные вопросы