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