Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > with statement и StreamReader/Writer


Автор: Void 19.10.2006, 19:19
Обнаружил, как мне кажется, небольшой огрех в реализации классов потокового (де)кодирования в модуле codecs.
Вот такой код:
Код
from __future__ import with_statement

import codecs

with codecs.open('file.txt', 'r', 'windows-1251') as f:
    # do something with file

работает совсем не так, как
Код
f = codecs.open('file.txt', 'r', 'windows-1251')
with f:
    # do something with file

В первом случае f присваивается значение, возвращаемое методом __enter__ созданного объекта. Но этот метод среди прочих просто делегируется инкапсулируемому объекту file и возвращает сам этот объект, а не кодек. В результате появляются странные ошибки выполнения.
Решение очевидно: добавить метод
Код
def __enter__(self):
    return self

в реализации StreamReader, StreamWriter и StreamReaderWriter.
Или такой quick fix в собственном модуле:
Код
codecs.StreamReaderWriter.__enter__ = lambda self: self

Возможно, кому-то это сэкономит те минуты, которые я потратил на поиск ошибки smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)