Python: Получить строковое представление Pyobject?
Вопрос
У меня есть расширение C Python, и я хотел бы распечатать диагностику.
Я получаю строку как пиобект*.
Каков канонический способ получить струнный повторение этого объекта, так что он приготовил для использования в качестве константа *?
Обновить: уточняется, чтобы подчеркнуть доступ как const char *.
Решение
Использовать PyObject_Repr
(чтобы имитировать Python's 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);
Другие советы
Вот правильный ответ, если вы используете 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);
}
Пытаться PyObject_Repr
(чтобы имитировать Python's repr
) или же PyObject_Str
(чтобы имитировать Python's str
).
Документы:
Вычислить строковое представление объекта o. Возвращает строковое представление об успехе, NULL при неудаче. Это эквивалент экспрессии Python Perpry (O). Вызывается встроенной функцией PERP ().
Если вам нужно просто распечатать объект в Python 3, вы можете использовать одну из этих функций:
static void print_str(PyObject *o)
{
PyObject_Print(o, stdout, Py_PRINT_RAW);
}
static void print_repr(PyObject *o)
{
PyObject_Print(o, stdout, 0);
}