python - Exponer un objeto similar a un archivo de Cython
file-io (1)
Necesito exponer un objeto similar a un archivo de una biblioteca de C que estoy envolviendo con un módulo de Cython. Quiero reutilizar el código io genérico de python para cosas como buffering, readline (), etc.
El nuevo módulo de IO parece ser justo lo que necesito, pero en realidad usarlo desde Cython parece ser no trivial, he intentado varios enfoques:
Mi código en una clase cdef que hereda de IO.RawIOBase: esto falla porque las clases cdef solo pueden heredar de otras clases cython cdef, mientras que IO es "C" sin formato.
Mi código en una clase cdef, otra clase (no cdef) que hereda tanto mi clase cdef como RawIOBase - Falla con "TypeError: varias bases tienen conflicto de distribución de instancia"
Mi código en una clase (no cdef) que hereda de RawIOBase. Esto funciona, pero pierdo la capacidad de almacenar mi contenido de nivel C (que necesito para hablar con la biblioteca subyacente) dentro de la clase, así que necesito una marca un envoltorio cdef a su alrededor y almacenarlo como miembro ... esto parece un desastre.
Mi código en la clase cdef que no hereda (Raw) IOBase en lugar de reimplementar su funcionalidad, el código Python hace que mi objeto se envuelva en BufferedReader / BufferedWriter - Este parece funcionar y es menos desordenado que la opción anterior.
Mis preguntas:
1) ¿Estoy perdiendo algo y reinventando la rueda aquí?
2) ¿Cuál es el contenido exacto de IOBase que debo implementar para mantener a BufferedReader / Writer feliz con mi objeto en las versiones actuales y futuras de python? ¿Está esto documentado en alguna parte?
3) ¿Cómo funcionará en python 2.6 donde IO es python puro? Supongo que el rendimiento sufrirá pero funcionará, ¿verdad?
¿Sería demasiado ineficaz llamar a os.fdopen()
en el número del descriptor de archivos devuelto por la biblioteca subyacente, y luego enviar las llamadas normales del método Python al objeto de archivo resultante para hacer su entrada y salida? Con la mayoría de las E / S, me sorprendería si pudiera ver una diferencia con respecto a si llamó directamente a una rutina de C o dejó que la lógica de despacho del método Python lo llamara por usted, pero, por supuesto, podría estar en una situación inusual podría estar equivocado!