lazy evaluation of a variable
Jose H. Martinez
josehmartinezz at gmail.com
Sun Jun 17 19:54:24 EDT 2012
Another option would be to refactor your function so that it is a generator
expression using the yield keyword.
On Sun, Jun 17, 2012 at 7:40 PM, Peter Otten <__peter__ at web.de> wrote:
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20120617/89e95a82/attachment.html>
More information about the Python-list
mailing list