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

Reply via email to