sistema - Python: obtener la representación de cadena de PyObject?
python importar fecha (4)
Tengo una extensión de Python C, y me gustaría imprimir algunos diagnósticos.
Estoy recibiendo una cadena como PyObject *.
¿Cuál es la forma canónica de obtener una cadena de caracteres de este objeto, de modo que se pueda usar como un carácter const?
actualización: aclarado para enfatizar el acceso como const char *.
Aquí está la respuesta correcta si está usando 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);
}
Pruebe PyObject_Repr
(para imitar la PyObject_Repr
de Python) o PyObject_Str
(para imitar la str
de Python''s).
Docs:
Calcular una representación de cadena de objeto o. Devuelve la representación de cadena en caso de éxito, NULL en caso de error. Este es el equivalente de la expresión de Python repr (o). Llamado por la función repr () incorporada.
Si solo necesita imprimir el objeto en Python 3, puede usar una de estas funciones:
static void print_str(PyObject *o)
{
PyObject_Print(o, stdout, Py_PRINT_RAW);
}
static void print_repr(PyObject *o)
{
PyObject_Print(o, stdout, 0);
}
Use PyObject_Repr
(para imitar la función de PyObject_Str
Python) o PyObject_Str
(para imitar str
), y luego llame a PyString_AsString
para obtener char *
(puede, y generalmente debería, usarlo como const char*
, por ejemplo:
PyObject* objectsRepresentation = PyObject_Repr(yourObject);
const char* s = PyString_AsString(objectsRepresentation);
Este método está bien para cualquier PyObject
. Si está absolutamente seguro de que su yourObject
es una cadena de Python y no otra cosa, como por ejemplo un número, puede omitir la primera línea y simplemente hacer:
const char* s = PyString_AsString(yourObject);