среда, 13 августа 2008 г.

Синглтон в 3 строки

Сегодня показали интересную реализацию синглтона на питоне:

Read More...

понедельник, 11 августа 2008 г.

default параметр в getattr

В примере увидел интересный способ использования getattr. Третий необязательный параметр функции (getattr( object, name[, default])) - значение, которое будет возвращено, если атрибута с указанным именем не существует. Если использовать лямбду, которая делает "ничего" - lambda : None, то во многих случаях можно отказаться от использования дополнительной функции hasattr:

Read More...

пятница, 8 августа 2008 г.

Оператор with в Python

В прошлом посте я жаловался, что в Python мне не хватает чего-то похожего на C++-ные деструкторы, которые вызываются в любом случае для объекта созданного в стеке при выходе из области видимости, даже когда возникает исключение. В комментария, AQUAGNU упомянул оператор with, который в Python 2.5 был еще на "птичьих правах" (для его использования надо импортировать with_statement из модуля __future__), а в 2.6 стал зарезервированным словом.

Оператор with автоматизирует выполнение операций при входе в блок кода и при выходе из него не зависимо от того, было ли исключении при исполнении блока. Под операциями входа в блок и выхода из блока имеется ввиду, например, открытие и закрытие файла, залочивание и разлочивание при синхронизации. Это можно делать (как я раньше и делал) при помощи try/finally:
with все несколько упрощает:
Объект, который подается на вход with, называется менеджером контекста. У него должен быть реализован протокол менеджера контекста, состоящий из двух методов:
__enter__() - вызывается перед началом выполнения блока (контекста);
__exit__(type, value, traceback) - вызывается по завершению выполнения блока. Параметры, передаваемые ему, описывают исключение, если блок его сгенерировал.

В общем виде это выглядит так (взято отсюда):

В 2.5 версии контекст менеджерами могут выступать файлы, thread.LockType, threading.Lock, threading.RLock, threading.Condition, threading.Semaphore, threading.BoundedSemaphore. Применение with для Lock было показанное во втором примере. Для остальных случаев, прийдется реализовать протокол менеджера контекста или сделать адаптер:

Вот такой вот забавный оператор with.

PS: оказывается with был еще в делфи
PS2: дополнительно можно почитать здесь и здесь.

Read More...