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

StackOverflow https://stackoverflow.com/questions/5356773

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть расширение 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top