为什么tempfile.SpooledTemporaryFile不能实现可读,可写,可搜索?

mpa*_*tek 5 python io temporary-files

在Python 3.6.1中,我尝试在io.TextIOWrapper中包装tempfile.SpooledTemporaryFile:

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)
Run Code Online (Sandbox Code Playgroud)

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

AttributeError: 'SpooledTemporaryFile' object has no attribute 'readable'
Run Code Online (Sandbox Code Playgroud)

如果我创建一个简单的类这样的,我可以绕过错误(我得到类似的错误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 
Run Code Online (Sandbox Code Playgroud)

tempfile.SpooledTemporaryFile有没有一个很好的理由还没有这些属性?

Mik*_*ent 8

SpooledTemporaryFile实际上_file在引擎盖下使用了 2 种不同的实现 - 最初是一个ioBuffer (StringIOBytesIO),直到它翻转并通过tempfile.TemporaryFile()(例如,当max_size超出时)创建一个“类文件对象” 。

io.TextIOWrapper需要一个BufferedIOBase基类/接口,它由io.StringIOand提供io.BytesIO,但不一定由返回的对象提供TemporaryFile()(尽管在我在 OSX 上的测试中,TemporaryFile()返回了一个_io.BufferedRandom具有所需接口的对象,我的理论是这可能取决于平台)。

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

  • 这*似乎*可能是一个错误,所以我将它记录在 python 问题跟踪器中作为 32600。修补 IOBase 的必要属性的解决方法似乎使一切正常,并且似乎它们应该在那里,无论是否对象是 IO 缓冲区或实际(临时)文件。 (3认同)