lazy evaluation of a variable
Peter Otten
__peter__ at web.de
Sun Jun 17 19:40:57 EDT 2012
Gelonida N wrote:
> I'm having a module, which should lazily evaluate one of it's variables.
> Meaning that it is evaluated only if anybody tries to use this variable.
>
> At the moment I don't know how to do this and do therefore following:
>
>
> ####### mymodule.py #######
> var = None
>
> def get_var():
> global var
> if var is not None:
> return var
> var = something_time_consuming()
>
>
>
> Now the importing code would look like
>
> import mymodule
> def f():
> var = mymodule.get_var()
>
> The disadvantage is, that I had to change existing code directly
> accessing the variable.
>
>
> I wondered if there were any way to change mymodule.py such, that the
> importing code could just access a variable and the lazy evaluation
> would happen transparently.
>
> import mymodule
> def f():
> var = mymodule.var
>
>
>
> Thanks in advance for you suggestions
You can inject arbitrary objects into sys.modules:
>>> import sys
>>> class MyModule(object):
... def __init__(self):
... self._var = None
... @property
... def var(self):
... result = self._var
... if result is None:
... print "calculating..."
... self._var = result = 42
... return result
...
>>> sys.modules["mymodule"] = MyModule()
>>> import mymodule
>>> mymodule.var
calculating...
42
>>> mymodule.var
42
More information about the Python-list
mailing list