Python: получить строковое представление PyObject? - PullRequest
33 голосов
/ 18 марта 2011

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

Я получаю строку в виде PyObject *.

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

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

Ответы [ 4 ]

42 голосов
/ 21 ноября 2011

Используйте PyObject_Repr (для имитации функции repr Python) или 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);
18 голосов
/ 13 сентября 2017

Вот правильный ответ, если вы используете 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);
}
5 голосов
/ 18 марта 2011

Попробуйте PyObject_Repr (для имитации Python repr) или PyObject_Str (для имитации Python str).

Документы:

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

2 голосов
/ 05 августа 2018

Если вам нужно просто напечатать объект в 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);
}
...