См. Ниже пример минимального Python с использованием io.BufferedReader, который действует очень странно.
Результаты не совпадают между 3 вызовами.2 работы, и последний, самый важный не делает.Я слишком долго смотрю на это и не вижу проблемы.Может быть, я делаю что-то не так, что мне не хватает.Пожалуйста, взгляните.Я использую Python 2.7.15+ в Ubuntu 18.04.3 LTS.
Примечание. Результаты приведены в комментарии ### под строками, которые выдают результат.
from io import BytesIO, StringIO, BufferedReader, DEFAULT_BUFFER_SIZE
class MDReader(BufferedReader):
def __new__(cls, thingtoread, buffer_size=DEFAULT_BUFFER_SIZE):
iothing = BytesIO(thingtoread) \
if isinstance(thingtoread, str) \
else StringIO(thingtoread) \
if isinstance(thingtoread, unicode) \
else thingtoread
print iothing
return iothing and BufferedReader.__new__(cls, iothing, buffer_size)
text = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
mdr0 = BufferedReader.__new__(MDReader, BytesIO(text), DEFAULT_BUFFER_SIZE)
### <_io.BytesIO object at 0x7f348d06bbf0>
mdr1 = MDReader(BytesIO(text), DEFAULT_BUFFER_SIZE)
### <_io.BytesIO object at 0x7f348d06ba70>
mdr2 = MDReader(text, DEFAULT_BUFFER_SIZE)
### Traceback (most recent call last):
### File "<stdin>", line 1, in <module>
### File "./foo.py", line 19, in <module>
### mdr2 = MDReader(text, DEFAULT_BUFFER_SIZE)
### AttributeError: 'str' object has no attribute 'readable'