Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> with statement и StreamReader/Writer, небольшой баг 
V
    Опции темы
Void
Дата 19.10.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Обнаружил, как мне кажется, небольшой огрех в реализации классов потокового (де)кодирования в модуле 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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.