I decided you probably should also have a cleanup function since garbage
collection won't work now unless you explicitly clean the function. This
approach works, and also works if you call the function again after you've
called cleanup (it just runs the function 1 more time, then again, returns
the cached result until you cleanup).

def func_once(func):
    "A decorator that runs a function only once."
    def decorated(*args, **kwargs):
        try:
            return decorated._once_result
        except AttributeError:
            decorated._once_result = func(*args, **kwargs)
            return decorated._once_result
    return decorated

def func_once_cleanup(func):
    del func._once_result

# Example, will only parse the document once
@func_once
def print_and_return_big_list():
    print "I'm the method you want to run once"
    return
[23,2342,234,234,234,24,654,687,54,9684,654,864981,651,849815,65498,1651,6984651,6541,654984,651,645]

if __name__=="__main__":
    print_and_return_big_list()
    print_and_return_big_list()
    print_and_return_big_list()
    print_and_return_big_list()
    print_and_return_big_list()

    func_once_cleanup(print_and_return_big_list)

    print_and_return_big_list(



On 11/2/07, Michael Langford <[EMAIL PROTECTED]> wrote:
>
> Decorate level2 with a decorator that caches:
>
>  http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425445
>
>     --Michael
>
> On 11/1/07, Kent Johnson <[EMAIL PROTECTED]> wrote:
> >
> > I am building a list like this:
> >
> >      tree = []
> >      for top in tops:
> >          l2 = level2(top)
> >          if l2:
> >              tree.append((top, l2))
> >
> > I would really like to turn this into a list comprehension:
> >
> > tree = [ (top, level2(top)) for top in tops if level2(top) ]
> >
> > but the call to level2() is expensive enough that I don't want to repeat
> > it. Is there any way to do this or am I stuck with the (IMO ugly) loop
> > form?
> >
> > Kent
> >
> > who actually does have a question occasionally :-)
> > _______________________________________________
> > Tutor maillist  -  Tutor@python.org
> > http://mail.python.org/mailman/listinfo/tutor
> >
>
>
>
> --
> Michael Langford
> Phone: 404-386-0495
> Consulting: http://www.TierOneDesign.com/




-- 
Michael Langford
Phone: 404-386-0495
Consulting: http://www.TierOneDesign.com/
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to