class_Missing(object):def__repr__(self):return'no value'def__reduce__(self):return'_missing'_missing=_Missing()classLazyProperty(object):""" Decorator for easier creation of ``property`` from potentially expensive to calculate attribute of the class. Usage:: class Foo(object): @LazyProperty def bar(self): print 'Calculating self._bar' return 42 Taken from http://blog.pythonisito.com/2008/08/lazy-descriptors.html and used widely. """def__init__(self,func):self._func=funcself.__module__=func.__module__self.__name__=func.__name__self.__doc__=func.__doc__def__get__(self,obj,klass=None):ifobjisNone:returnselfvalue=obj.__dict__.get(self.__name__,_missing)ifvalueis_missing:value=self._func(obj)obj.__dict__[self.__name__]=valuereturnvalueimportthreadingclassThreadLocalLazyProperty(LazyProperty):""" Same as above but uses thread local dict for cache storage. """def__get__(self,obj,klass=None):ifobjisNone:returnselfifnothasattr(obj,'__tl_dict__'):obj.__tl_dict__=threading.local().__dict__value=obj.__tl_dict__.get(self.__name__,_missing)ifvalueis_missing:value=self._func(obj)obj.__tl_dict__[self.__name__]=valuereturnvalue