Python: получить строковое представление PyObject?
У меня есть расширение Cython C, и я хотел бы распечатать некоторые диагностические данные.
Я получаю строку как PyObject *.
Каков канонический способ получения строкового представления этого объекта, так что он может использоваться как const char *?
update:, чтобы подчеркнуть доступ как const char *.
Ответы
Ответ 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);
}