Ленитесь! Это здорово

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 обычное поле, а я получаю экономию.

Мне такой прием очень понравился, и теперь стараюсь как можно чаще(но к месту) его использовать. Чего и вам желаю.