Вы тестировали только для InputType
, который является cStringIO.StringIO()
экземпляром, который поддерживает чтение.Похоже, у вас есть другой тип, OutputType
, экземпляр, созданный для экземпляра, который поддерживает запись в:
>>> import cStringIO
>>> finput = cStringIO.StringIO('Hello world!') # the input type, it has data ready to read
>>> finput
<cStringIO.StringI object at 0x1034397a0>
>>> isinstance(finput, cStringIO.InputType)
True
>>> foutput = cStringIO.StringIO() # the output type, it is ready to receive data
>>> foutput
<cStringIO.StringO object at 0x102fb99d0>
>>> isinstance(foutput, cStringIO.OutputType)
True
Вам необходимо проверитьдля обоих типов, просто используйте кортеж двух типов в качестве второго аргумента для isinstance()
:
from cStringIO import StringIO, InputType, OutputType
if not isinstance(content, (InputType, OutputType)):
content = StringIO(content)
или, и это лучше проверьте атрибуты read
и seek
, чтобы вы также могли поддерживать обычные файлы:
if not (hasattr(content, 'read') and hasattr(content, 'seek')):
# if not a file object, assume it is a string and wrap it in an in-memory file.
content = StringIO(content)
или просто проверить строки и [буферы] (https://docs.python.org/2/library/functions.html#buffer(,, поскольку онитолько два типа, которые может поддерживать StringIO()
:
if isinstance(content, (str, buffer)):
# wrap strings into an in-memory file
content = StringIO(content)
Это имеет дополнительный бонус, что любой другой файловый объект в библиотеке Python, включая сжатые файлы и tempfile.SpooledTemporaryFile()
и io.BytesIO()
, также будет приняти работа.