为什么 tempfile.SpooledTemporaryFile 不实现可读、可写、可查找?

Why doesn't tempfile.SpooledTemporaryFile implement readable, writable, seekable?

在 Python 3.6.1 中,我尝试将 tempfile.SpooledTemporaryFile 包装在 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)

wrapper = io.TextIOWrapper(tfh, encoding='utf-8')给我一个错误:

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

如果我像这样创建一个简单的 class,我可以绕过错误(writableseekable 会出现类似的错误):

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 

tempfile.SpooledTemporaryFile 还没有这些属性是否有充分的理由?

SpooledTemporaryFile 实际上在幕后使用了 2 个不同的 _file 实现——最初是一个 io 缓冲区(StringIOBytesIO),直到它翻转并通过 tempfile.TemporaryFile() 创建一个 "file-like object" (例如,当超过 max_size 时)。

io.TextIOWrapper 需要 BufferedIOBase 基础 class/interface,它由 io.StringIOio.BytesIO 提供,但不一定由 [= 返回的对象提供21=](虽然在我对 OSX 的测试中,TemporaryFile() 返回了一个 _io.BufferedRandom 对象,它具有所需的接口,我的理论是这可能取决于平台)。

因此,我希望您的 MySpooledTempfile 包装器在翻转后可能会在某些平台上失败。