Python tiene el maravilloso módulo collections
que tiene herramientas que le permiten implementar un completo dict
(por ejemplo) a partir de un conjunto mínimo de métodos. ¿Hay algo similar para la interfaz file
en Python? Si no es así, ¿qué recomendaría como un conjunto mínimo de métodos para implementar para un objeto similar a file
para fines de tipado de pato?¿Cuál es el subconjunto mínimo de métodos de archivos que necesito implementar para obtener la interfaz completa de archivos de Python?
¿Y cómo maneja cosas que le gustaría utilizar su archivo como objeto en una declaración with
, como puede hacerlo con un archivo normal o que quiera iterar sobre él (como puede hacerlo con un archivo normal) o ¿Quién quiere poder llamar al readline
o al readlines
y hacer algo inteligente y útil (como se puede hacer con un archivo normal)? ¿Tienes que implementarlos todos tú mismo? ¿O hay mejores opciones?
Sé que puedo implementar todos y cada uno de estos, a mano. Pero la interfaz collections
me permite implementar un dict
implementando solo __len__
, __iter__
, __setitem__
y __getitem__
. Consigo pop
, popitem
, clear
, update
, setdefault
, __contains__
, keys
, items
, values
, get
, __eq__
y __ne__
todo gratis. Hay una interfaz mínima para __dict__
definida, y si la implemento, obtengo la interfaz completa dict
, implementando todos los métodos adicionales en términos de la interfaz mínima.
Del mismo modo, me gustaría saber cuál es la interfaz mínima para el archivo que tengo que implementar para obtener la interfaz completa. ¿Hay una manera de conseguir __enter__
, __exit__
, readline
, readlines
, __iter__
y next
si acabo de implementar read
, write
y close
, o tengo que poner en práctica todo lo que a mí mismo con la mano cada vez que quiero la interfaz completa file
?
Quiero saber, ¿hay alguna manera de evitar tener que implementar todo eso yo mismo? Ya hay un administrador de contexto para los objetos similares a archivos, ya hay un buffer de línea para objetos similares a archivos, ya hay un iterador para objetos similares a archivos. ¿Hay alguna forma de que pueda usarlos en lugar de tener que implementarlos yo mismo? Me gustaría poder hacerlo solo con la implementación de un método de "lectura" y "escritura". – Omnifarious
@Omnifarious. Usted solo implementa lo que su aplicación realmente necesita. Si su aplicación solo necesita leer y escribir, eso es todo lo que implementa. Un "buffer de línea" no tiene sentido. Un iterador es trivial (es una función con 'yield'.) El gestor de contexto, de manera similar, se puede utilizar desde el paquete' contextlib'. Puede que no sea mucho código. Dado que su pregunta es vaga, la respuesta debe ser necesariamente vaga. Si proporcionó algunos ejemplos de cómo desea utilizar su nuevo objeto similar a un archivo, podríamos proporcionarle consejos más concretos. –
@Omnifarious. Si desea que todos los métodos funcionen, debe implementar todos los métodos. A diferencia de las colecciones, no hay una clase base abstracta para los archivos. –