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 -- http://mail.python.org/mailman/listinfo/python-list