def lazy(func, *resultclasses):
 @total_ordering
 class __proxy__(Promise, ):
  '\n        Encapsulate a function call and act as a proxy for methods that are\n        called on the result of that function. The function is not evaluated\n        until one of the methods on the result is called.\n        '
  __dispatch = None
  def __init__(self, args, kw):
   self.__args = args
   self.__kw = kw
   if (self.__dispatch is None):
    self.__prepare_class__()
  def __reduce__(self):
   return (_lazy_proxy_unpickle, ((func, self.__args, self.__kw) + resultclasses))
  @classmethod
  def __prepare_class__(cls):
   cls.__dispatch = {}
   for resultclass in resultclasses:
    cls.__dispatch[resultclass] = {}
    for type_ in reversed(resultclass.mro()):
     for (k, v) in type_.__dict__.items():
      meth = cls.__promise__(resultclass, k, v)
      if hasattr(cls, k):
       continue
      setattr(cls, k, meth)
   cls._delegate_bytes = (bytes in resultclasses)
   cls._delegate_text = (six.text_type in resultclasses)
   assert (not (cls._delegate_bytes and cls._delegate_text)), 'Cannot call lazy() with both bytes and text return types.'
   if cls._delegate_text:
    if six.PY3:
     cls.__str__ = cls.__text_cast
    else:
     cls.__unicode__ = cls.__text_cast
   elif cls._delegate_bytes:
    if six.PY3:
     cls.__bytes__ = cls.__bytes_cast
    else:
     cls.__str__ = cls.__bytes_cast
  @classmethod
  def __promise__(cls, klass, funcname, method):
   def __wrapper__(self, *args, **kw):
    res = func(*self.__args, **self.__kw)
    for t in type(res).mro():
     if (t in self.__dispatch):
      return self.__dispatch[t][funcname](res, *args, **kw)
    raise TypeError('Lazy object returned unexpected type.')
   if (klass not in cls.__dispatch):
    cls.__dispatch[klass] = {}
   cls.__dispatch[klass][funcname] = method
   return __wrapper__
  def __text_cast(self):
   return func(*self.__args, **self.__kw)
  def __bytes_cast(self):
   return bytes(func(*self.__args, **self.__kw))
  def __cast(self):
   if self._delegate_bytes:
    return self.__bytes_cast()
   elif self._delegate_text:
    return self.__text_cast()
   else:
    return func(*self.__args, **self.__kw)
  def __ne__(self, other):
   if isinstance(other, Promise):
    other = other.__cast()
   return (self.__cast() != other)
  def __eq__(self, other):
   if isinstance(other, Promise):
    other = other.__cast()
   return (self.__cast() == other)
  def __lt__(self, other):
   if isinstance(other, Promise):
    other = other.__cast()
   return (self.__cast() < other)
  def __hash__(self):
   return hash(self.__cast())
  def __mod__(self, rhs):
   if (self._delegate_bytes and six.PY2):
    return (bytes(self) % rhs)
   elif self._delegate_text:
    return (six.text_type(self) % rhs)
   return (self.__cast() % rhs)
  def __deepcopy__(self, memo):
   memo[id(self)] = self
   return self
 @wraps(func)
 def __wrapper__(*args, **kw):
  return __proxy__(args, kw)
 return __wrapper__

def lazy ( func , * resultclasses ) : @ total_ordering class __proxy__ ( Promise , ) : __dispatch = None def __init__ ( self , args , kw ) : self . __args = args self . __kw = kw if ( self . __dispatch is None ) : self . __prepare_class__ ( ) def __reduce__ ( self ) : return ( _lazy_proxy_unpickle , ( ( func , self . __args , self . __kw ) + resultclasses ) ) @ classmethod def __prepare_class__ ( cls ) : cls . __dispatch = { } for resultclass in resultclasses : cls . __dispatch [ resultclass ] = { } for type_ in reversed ( resultclass . mro ( ) ) : for ( k , v ) in type_ . __dict__ . items ( ) : meth = cls . __promise__ ( resultclass , k , v ) if hasattr ( cls , k ) : continue setattr ( cls , k , meth ) cls . _delegate_bytes = ( bytes in resultclasses ) cls . _delegate_text = ( six . text_type in resultclasses ) assert ( not ( cls . _delegate_bytes and cls . _delegate_text ) ) , 'Cannot call lazy() with both bytes and text return types.' if cls . _delegate_text : if six . PY3 : cls . __str__ = cls . __text_cast else : cls . __unicode__ = cls . __text_cast elif cls . _delegate_bytes : if six . PY3 : cls . __bytes__ = cls . __bytes_cast else : cls . __str__ = cls . __bytes_cast @ classmethod def __promise__ ( cls , klass , funcname , method ) : def __wrapper__ ( self , * args , ** kw ) : res = func ( * self . __args , ** self . __kw ) for t in type ( res ) . mro ( ) : if ( t in self . __dispatch ) : return self . __dispatch [ t ] [ funcname ] ( res , * args , ** kw ) raise TypeError ( 'Lazy object returned unexpected type.' ) if ( klass not in cls . __dispatch ) : cls . __dispatch [ klass ] = { } cls . __dispatch [ klass ] [ funcname ] = method return __wrapper__ def __text_cast ( self ) : return func ( * self . __args , ** self . __kw ) def __bytes_cast ( self ) : return bytes ( func ( * self . __args , ** self . __kw ) ) def __cast ( self ) : if self . _delegate_bytes : return self . __bytes_cast ( ) elif self . _delegate_text : return self . __text_cast ( ) else : return func ( * self . __args , ** self . __kw ) def __ne__ ( self , other ) : if isinstance ( other , Promise ) : other = other . __cast ( ) return ( self . __cast ( ) != other ) def __eq__ ( self , other ) : if isinstance ( other , Promise ) : other = other . __cast ( ) return ( self . __cast ( ) == other ) def __lt__ ( self , other ) : if isinstance ( other , Promise ) : other = other . __cast ( ) return ( self . __cast ( ) < other ) def __hash__ ( self ) : return hash ( self . __cast ( ) ) def __mod__ ( self , rhs ) : if ( self . _delegate_bytes and six . PY2 ) : return ( bytes ( self ) % rhs ) elif self . _delegate_text : return ( six . text_type ( self ) % rhs ) return ( self . __cast ( ) % rhs ) def __deepcopy__ ( self , memo ) : memo [ id ( self ) ] = self return self @ wraps ( func ) def __wrapper__ ( * args , ** kw ) : return __proxy__ ( args , kw ) return __wrapper__
turns any callable into a lazy evaluated callable .