On 6/17/2012 5:35 PM, Gelonida N wrote:
I'm having a module, which should lazily evaluate one of it's variables.
If you literally mean a module object, that is not possible. On the
other hand, it is easy to do with class instances, via the __getattr__
special method or via properties.
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
You could now do (untested, too late at night)
# mymodule.py
class _Lazy():
def __getattr__(self, name):
if name == 'var':
self.var = something_time_consuming()
return self.var
lazy = _Lazy()
# user script
from mymodule import lazy
def f():
var = lazy.var
See Peter's post for using properties instead. That probably scales
better for multiple lazy attibutes.
--
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list