El artículo tiene como objetivo escribir código de extensión C que consuma elementos de cualquier objeto iterable, como una lista, una tupla, un archivo o un generador.
Código # 1: función de extensión C que muestra cómo consumir los elementos en un iterable.
static PyObject* py_consume_iterable( PyObject* self, PyObject* args) { PyObject* obj; PyObject* iter; PyObject* item; if (!PyArg_ParseTuple(args, "O", &obj)) { return NULL; } if ((iter = PyObject_GetIter(obj)) == NULL) { return NULL; } while ((item = PyIter_Next(iter)) != NULL) { /* Use item */ ... Py_DECREF(item); } Py_DECREF(iter); return Py_BuildValue(""); }
El código anterior refleja un código similar en Python. La PyObject_GetIter()
llamada es lo mismo que llamar iter()
para obtener un iterador. La PyIter_Next()
función invoca el siguiente método en el iterador que devuelve el siguiente elemento o NULL si no hay más elementos. Asegúrese de tener cuidado con la administración de la memoria: Py_DECREF()
debe invocarse tanto en los elementos producidos como en el propio objeto iterador para evitar pérdidas de memoria.
Diagnóstico de fallas de segmentación:
el intérprete se bloquea violentamente con una falla de segmentación, error de bus, violación de acceso u otro error fatal. A uno le gusta obtener un seguimiento de Python que muestre dónde se estaba ejecutando el programa en el punto de falla.
El módulo de manejo de fallas se puede usar para ayudarlo a resolver este problema. Incluya el siguiente código en su programa.
Código #2:
import faulthandler faulthandler.enable()
Alternativamente, ejecute Python con la opción -Xfaulthandler como esta:
bash % python3 -Xfaulthandler program.py
Por último, pero no menos importante, la variable de entorno PYTHONFAULTHANDLER se puede configurar en consecuencia. Con el controlador de fallas habilitado, los errores fatales en las extensiones C darán como resultado que se imprima un seguimiento de Python en las fallas. Por ejemplo:
Fatal Python error: Segmentation fault Current thread 0x00007fff71106cc0: File "example.py", line 6 in foo File "example.py", line 10 in bar File "example.py", line 14 in spam File "example.py", line 19 inSegmentation fault
Aunque esto no dirá en qué parte del código C salió mal, al menos puede decir cómo llegó allí desde Python.
El manejador de fallas mostrará el seguimiento de la pila del código de Python que se ejecuta en el momento de la falla. Como mínimo, esto mostrará la función de extensión de nivel superior que se invocó. Con la ayuda de pdb u otro depurador de Python, se puede investigar el flujo del código de Python que conduce al error.
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA