Пример минимального Python с использованием BufferedReader, ведущий себя странно - PullRequest
0 голосов
/ 26 сентября 2019

См. Ниже пример минимального 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'

1 Ответ

0 голосов
/ 26 сентября 2019

если вы замените возврат в __new__ на:

  self = iothing and BufferedReader.__new__(cls, iothing, buffer_size)
  cls.__init__(self, iothing, buffer_size)
  return self

  def __init__(self, *args, **kwargs):
    print '__init__', args
    print '__init__', kwargs

, тогда он будет работать правильно.Не имеет ничего общего с чем-либо, кроме как я забыл обработать __init__.Или, что еще лучше, просто переместите код обработки аргумента в __init__ и удалите __new __.

Извините, что опубликовал это.Я думаю, что просто не видел очевидного, потому что искал что-то с ценностями.Doh!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...