django_auxilium.utils.functools.lazy module¶
-
class
django_auxilium.utils.functools.lazy.LazyDecorator(types)[source]¶ Bases:
django_auxilium.utils.functools.decorators.DecoratorLazy evaluation decorator.
Parameters: types (tuple, list) – Iterable of possible output data-types of the output of the input function Examples
>>> lazy = LazyDecorator >>> @lazy([six.string_types, int]) ... def a(bar): ... print('invoking a with {0}'.format(bar)) ... if isinstance(bar, int): ... return bar + 5 ... else: ... return bar + 'foo' >>> l = a('bar') >>> isinstance(l, six.string_types) invoking a with bar True >>> print(l) barfoo >>> l = a(5) >>> isinstance(l, int) invoking a with 5 True >>> print(l) 10
-
get_lazy_wrapper_class()[source]¶ Construct lazy wrapper class for the given possible types
Returns: Lazy wrapper class specifically made for the possible types Return type: type
-
get_possible_types(possible_types)[source]¶ Get possible types as a list
Parameters: possible_types (list, any) – Either a list of possible types or a single possible type Returns: List of possible types. If the input possible_typeswas given as a single possible types, a list with a single item is returned.Return type: list
-
-
class
django_auxilium.utils.functools.lazy.LazyWrapper(f, args, kwargs)[source]¶ Bases:
django.utils.functional.PromiseWrapper class for lazy objects as returned by the
LazyDecoratorThe job of this wrapper is to not execute the inner function to get the result until absolutely necessary. For example simply storing a variable will not trigger inner function to be executed until something is done with the variable such as printing it, etc.
Parameters: - f (def) – Function which this lazy object wraps
- args (tuple) – Tuple of arguments which were passed to the function for execution
- kwargs (dict) – Dict of keyword arguments which were passed to the function for execution
-
class
django_auxilium.utils.functools.lazy.LazyWrapperMeta[source]¶ Bases:
typeMetaclass for
LazyWrapperThe reason we need metaclass is because we need to customize some magic methods for
LazyWrapperfor particular types while creating class which is what metaclasses are for!This metaclass expects all subclasses of
LazyWrapperto supplypossible_typesattribute which this metaclass will use to customize the created class.
-
django_auxilium.utils.functools.lazy.SPECIAL_METHODS= ['__abs__', '__add__', '__and__', '__call__', '__cmp__', '__coerce__', '__contains__', '__delitem__', '__delslice__', '__div__', '__divmod__', '__eq__', '__float__', '__floordiv__', '__ge__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__hex__', '__iadd__', '__iand__', '__idiv__', '__idivmod__', '__ifloordiv__', '__ilshift__', '__imod__', '__imul__', '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', '__long__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rfloorfiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setitem__', '__setslice__', '__str__', '__sub__', '__truediv__', '__unicode__', '__xor__', 'next']¶ The list of special methods is compiled from http://code.activestate.com/recipes/496741-object-proxying/
-
django_auxilium.utils.functools.lazy.flazy(f, possible_types)[source]¶ Wrapper function for the
LazyDecoratorIt has the same API as Django’s
lazyfunction so the same code can be reused with this decorator if necessary.Examples
>>> def f(): ... print('inside f') ... return 5 >>> g = flazy(f, int) >>> h = g() >>> print(str(h)) inside f 5
-
django_auxilium.utils.functools.lazy.lazy¶