Подтвердить что ты не робот

Python: получить строковое представление PyObject?

У меня есть расширение Cython C, и я хотел бы распечатать некоторые диагностические данные.

Я получаю строку как PyObject *.

Каков канонический способ получения строкового представления этого объекта, так что он может использоваться как const char *?

update:, чтобы подчеркнуть доступ как const char *.

4b9b3361

Ответ 1

Используйте PyObject_Repr (для имитации функции Python repr) или PyObject_Str (для имитации str), а затем вызовите PyString_AsString, чтобы получить char * (вы можете и обычно должны использовать его как const char*, например:

PyObject* objectsRepresentation = PyObject_Repr(yourObject);
const char* s = PyString_AsString(objectsRepresentation);

Этот метод подходит для любого PyObject. Если вы абсолютно уверены, что yourObject - это строка Python, а не что-то еще, например, число, вы можете пропустить первую строку и просто:

const char* s = PyString_AsString(yourObject);

Ответ 2

Попробуйте PyObject_Repr (чтобы имитировать Python repr) или PyObject_Str (чтобы имитировать Python str).

Docs:

Вычислить строковое представление объект o. Возвращает строку представление об успехе, NULL on отказ. Это эквивалент Выражение выражения python (o). Вызывается встроенная функция repr().

Ответ 3

Вот правильный ответ, если вы используете Python 3:

static void reprint(PyObject *obj) {
    PyObject* repr = PyObject_Repr(obj);
    PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "~E~");
    const char *bytes = PyBytes_AS_STRING(str);

    printf("REPR: %s\n", bytes);

    Py_XDECREF(repr);
    Py_XDECREF(str);
}