Как использовать объект потока Python?

1

У меня есть функция, которая принимает открытый объект file и записывает данные так:

def Write(self, file):
    file.write("Data")

Теперь я хотел бы протестировать эту функцию, и я подумал, что было бы аккуратно делать это с помощью какого-то потока, который не записывает данные в файл. Я не смог найти класс Python2.7, который выполняет эту работу, кроме класса StringIO. Однако в Python2.7 этот класс ожидает строку unicode в функции записи. (file.write(u"Data")) Поэтому я не могу проверить свою функцию Write с помощью класса StringIO.
В моем обходном пути я создал небольшой фиктивный класс

class MyStream(object):
    S = property(lambda self: self._S)

    def __init__(self):
        self._S = ""

    def write(self, s):
        self._S += s

с которым я могу теперь успешно протестировать мою функцию Write.

Мой вопрос:
Есть ли собственный класс python, который делает тот же трюк?
спасибо заранее для любых предложений
С уважением, Вольтан

  • 3
    Есть два различных StringIO классов в Python 2.7: io.StringIO и StringIO.StringIO . Последний принимает как экземпляры str экземпляры unicode .
  • 0
    @ Свен Великолепно. Разместите его как ответ, и вы получите 15 баллов !!! ;)
Показать ещё 2 комментария
Теги:
python-2.7
io
stream

1 ответ

1
Лучший ответ

Как говорится в документации io:

Поскольку этот модуль был разработан в основном для Python 3.x, вы должны знать, что все использования "байтов" в этом документе относятся к типу str (из которых байты являются псевдонимами), и все виды использования "text" относятся к типу Unicode. Кроме того, эти два типа не взаимозаменяемы в API io.

т.е. если вы используете бэкпортированную библиотеку Python 3 IO, вам нужно использовать unicode. Однако исходный класс StringIO, который рассматривает байты (строки Python 2) и принимает их, все еще существует в Python 2.7, он просто не находится в backported io. Вместо этого он имеет свой собственный модуль, также называемый StringIO.

  • 0
    Нет, это не работает: TypeError: initial_value must be unicode or None, not str
  • 0
    Видел это сам при тестировании. Отредактировано с совершенно другим предложением, вдохновленным комментарием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню