Skip to content

Instantly share code, notes, and snippets.

@mbarkhau
Created March 4, 2014 00:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbarkhau/9337645 to your computer and use it in GitHub Desktop.
Save mbarkhau/9337645 to your computer and use it in GitHub Desktop.
LazyObject and decorator
# "Of being lazy" February 2, 2013 by Paul Masurel
# http://fulmicoton.com/posts/lazy/
class LazyObject(object):
__slots__ = [ "_recipe", "_result", "_evaluated" ]
def __init__(self, recipe):
object.__setattr__(self, "_recipe", recipe)
object.__setattr__(self, "_result", None)
object.__setattr__(self, "_evaluated", False)
def _eval(self,):
if not self._evaluated:
object.__setattr__(self, "_result", self._recipe())
object.__setattr__(self, "_evaluated", True)
return self._result
def __getattr__(self, name, *args, **kargs):
return getattr(self._eval(), name, *args, **kargs)
def __setattr__(self, name, *args, **kargs):
return setattr(self._eval(), name, *args, **kargs)
def __getitem__(self, key, *args, **kargs):
return self._eval().__getitem__(key, *args, **kargs)
def __len__(self,):
return len(self._eval())
def __add__(self,*args,**kargs):
return self._eval().__add__(*args,**kargs)
def __repr__(self,):
return repr(self._eval())
# ... __mult__, __slice__ and so on ...
# the lazy evaluation decorator !
def lazy(f):
def aux(*args, **kargs):
def recipe():
return f(*args,**kargs)
return LazyObject(recipe)
return aux
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment