¿Por qué tempfile.SpooledTemporaryFile implementa legible, escribible, buscable?

En Python 3.6.1, he intentado envolver un archivo temporal.SpooledTemporaryFile en un io.TextIOWrapper:

with tempfile.SpooledTemporaryFile() as tfh: do_some_download(tfh) tfh.seek(0) wrapper = io.TextIOWrapper(tfh, encoding='utf-8') yield from do_some_text_formatting(wrapper) 

La línea wrapper = io.TextIOWrapper(tfh, encoding='utf-8') me da un error:

 AttributeError: 'SpooledTemporaryFile' object has no attribute 'readable' 

Si creo una clase simple como esta, puedo omitir el error (obtengo errores similares para writable y seekable ):

 class MySpooledTempfile(tempfile.SpooledTemporaryFile): @property def readable(self): return self._file.readable @property def writable(self): return self._file.writable @property def seekable(self): return self._file.seekable 

¿Hay una buena razón por la que tempfile.SpooledTemporaryFile no tenga estos atributos?

SpooledTemporaryFile realidad usa 2 implementaciones diferentes de _file bajo el capó, inicialmente un búfer io ( StringIO o BytesIO ), hasta que se desplaza y crea un “objeto similar a un archivo” a través de tempfile.TemporaryFile() (por ejemplo, cuando se excede max_size ).

io.TextIOWrapper requiere una clase / interfaz base BufferedIOBase , proporcionada por io.StringIO y io.BytesIO , pero no necesariamente por el objeto devuelto por TemporaryFile() (aunque en mis pruebas en OSX, TemporaryFile() devolvió un _io.BufferedRandom Objeto, que tenía la interfaz deseada, mi teoría es que esto puede depender de la plataforma).

Por lo tanto, esperaría que su reiniciador de MySpooledTempfile posiblemente falle en algunas plataformas después de la transferencia.