Lazy evaluation - ленивые вычисления. Очень хорошая идиома свойственная функциональным языкам программирования и python в том числе.
Выполнять действия по требованию достаточно выгодно - не расходуются ресурсы в пустую. Если затребовал кто-то некий сервис, то будь добр обработай, если он так и не затребован, тогда забудь и расслабься.
Вот недавно при реализации проекта онлайн-магазина столкнулся со случаем, когда некое подобие ленивых вычислений пригодилось. Кратко суть: каждый пользователь, который зашел в магазин получает корзину и может в неё добавлять(и не только, конечно) товары. Но зачем создавать для него всё "окружение", если он ничего так и не положил в корзину(и вообще ничего не делал) во время пребывания на сайте? Правильно, незачем.
Концепция эта была реализована в виде обычного джанговского middleware примерно такого вида:
class VisitorMiddleware( object ):
def process_request( self, request ):
setattr( request.__class__, "visitor", property( get_visitor) )
def get_visitor( self ):
if not hasattr( self, "_visitor_cache" ):
self._visitor_cache = Visitor()
#some visitor's environment creation heavy statements
#...
return self._visitor_cache
Ну так вот, при такой реализации, создание посетителя происходит только в первый момент обращения к соответствующему свойства запроса. И что самое главное, мне всё равно где это будет и как. Если этого не произойдет вообще, то объект посетителя не будет создан совсем, чего я и добивался. В итоге клиентский код request.visitor даже и не подозревает о такой специфики и работает как будто visitor обычное поле, а я получаю экономию.
Мне такой прием очень понравился, и теперь стараюсь как можно чаще(но к месту) его использовать. Чего и вам желаю.
