Created
March 4, 2014 00:21
-
-
Save mbarkhau/9337645 to your computer and use it in GitHub Desktop.
LazyObject and decorator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# "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