1

Я пытаюсь подключить модуль расширения от 2.7 до 3.5. Модуль расширения использует PyEval_EvalCode. Он делает это с некоторым кодом, аналогичным следующему:Использование PyEval_EvalCode в Python 3.5

struct _node *compiled_node = PyParser_SimpleParseString (in_string, Py_file_input); 
if (compiled_node) 
{ 
    PyCodeObject *compiled_code = PyNode_Compile (compiled_node, "temp.py"); 
    if (compiled_code) 
    { 
     return_value.Reset(PyEval_EvalCode (compiled_code, globals.get(), locals.get())); 
    } 
} 

В Python 2.7 это отлично работает. В Python 3.5 я получаю сбой компиляции, потому что PyNode_Compile возвращает PyCodeObject, но в Python 3.5 PyEval_EvalCodeпринимает a PyObject*. Что мне нужно сделать, чтобы преобразовать это в PyObject, который я могу передать на PyEval_EvalCode?

ответ

3

Для подавляющего большинства типов Python PyObject является «родительской» структурой типа. Попробуйте ввести аргумент: (PyObject*)compiled_code.

The Code Objects документы дают понять, что PyObject* может быть PyCodeObject* (иначе PyCode_Check бы не существовало), поэтому, если вы знаете, что это код объекта, приведение в безопасности.

+0

Спасибо, это странно, что они решили, что 'PyNode_Compile' возвращает' PyCodeObject' вместо 'PyObject', как это делают все остальные методы. Это бросило меня в петлю. –