为什么 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,我可以绕过错误(writable
和 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
tempfile.SpooledTemporaryFile 还没有这些属性是否有充分的理由?
SpooledTemporaryFile
实际上在幕后使用了 2 个不同的 _file
实现——最初是一个 io
缓冲区(StringIO
或 BytesIO
),直到它翻转并通过 tempfile.TemporaryFile()
创建一个 "file-like object" (例如,当超过 max_size
时)。
io.TextIOWrapper
需要 BufferedIOBase
基础 class/interface,它由 io.StringIO
和 io.BytesIO
提供,但不一定由 [= 返回的对象提供21=](虽然在我对 OSX 的测试中,TemporaryFile()
返回了一个 _io.BufferedRandom
对象,它具有所需的接口,我的理论是这可能取决于平台)。
因此,我希望您的 MySpooledTempfile
包装器在翻转后可能会在某些平台上失败。
在 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,我可以绕过错误(writable
和 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
tempfile.SpooledTemporaryFile 还没有这些属性是否有充分的理由?
SpooledTemporaryFile
实际上在幕后使用了 2 个不同的 _file
实现——最初是一个 io
缓冲区(StringIO
或 BytesIO
),直到它翻转并通过 tempfile.TemporaryFile()
创建一个 "file-like object" (例如,当超过 max_size
时)。
io.TextIOWrapper
需要 BufferedIOBase
基础 class/interface,它由 io.StringIO
和 io.BytesIO
提供,但不一定由 [= 返回的对象提供21=](虽然在我对 OSX 的测试中,TemporaryFile()
返回了一个 _io.BufferedRandom
对象,它具有所需的接口,我的理论是这可能取决于平台)。
因此,我希望您的 MySpooledTempfile
包装器在翻转后可能会在某些平台上失败。