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).
<br><br>def func_once(func):<br>&nbsp;&nbsp;&nbsp; &quot;A decorator that runs a function only once.&quot;<br>&nbsp;&nbsp;&nbsp; def decorated(*args, **kwargs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return decorated._once_result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except AttributeError:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decorated._once_result = func(*args, **kwargs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return decorated._once_result<br>&nbsp;&nbsp;&nbsp; return decorated<br><br>def func_once_cleanup(func):<br>&nbsp;&nbsp;&nbsp; del func._once_result<br><br># Example, will only parse the document once
<br>@func_once<br>def print_and_return_big_list():<br>&nbsp;&nbsp;&nbsp; print &quot;I&#39;m the method you want to run once&quot;<br>&nbsp;&nbsp;&nbsp; return [23,2342,234,234,234,24,654,687,54,9684,654,864981,651,849815,65498,1651,6984651,6541,654984,651,645]
<br><br>if __name__==&quot;__main__&quot;:<br>&nbsp;&nbsp;&nbsp; print_and_return_big_list()<br>&nbsp;&nbsp;&nbsp; print_and_return_big_list()<br>&nbsp;&nbsp;&nbsp; print_and_return_big_list()<br>&nbsp;&nbsp;&nbsp; print_and_return_big_list()<br>&nbsp;&nbsp;&nbsp; print_and_return_big_list()<br>
<br>&nbsp;&nbsp;&nbsp; func_once_cleanup(print_and_return_big_list)<br><br>&nbsp;&nbsp;&nbsp; print_and_return_big_list(<br><br><br><br><div><span class="gmail_quote">On 11/2/07, <b class="gmail_sendername">Michael Langford</b> &lt;<a href="mailto:mlangford.cs03@gtalumni.org">
mlangford.cs03@gtalumni.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Decorate level2 with a decorator that caches:
<br><br>&nbsp;<a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425445" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425445</a><br>
<br>&nbsp;&nbsp;&nbsp; --Michael <div><span class="e" id="q_1160209b03f80282_1"><br><br>
<div><span class="gmail_quote">On 11/1/07, <b class="gmail_sendername">Kent Johnson</b> &lt;<a href="mailto:kent37@tds.net" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">kent37@tds.net</a>&gt; wrote:
</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I am building a list like this:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; tree = []<br>&nbsp;&nbsp;&nbsp;&nbsp; for top in tops:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l2 = level2(top)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if l2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.append((top, l2))<br><br>I would really like to turn this into a list comprehension:
<br><br>tree = [ (top, level2(top)) for top in tops if level2(top) ]<br><br>but the call to level2() is expensive enough that I don&#39;t want to repeat<br>it. Is there any way to do this or am I stuck with the (IMO ugly) loop form?
<br><br>Kent<br><br>who actually does have a question occasionally :-)<br>_______________________________________________<br>Tutor maillist&nbsp;&nbsp;-&nbsp;&nbsp;<a href="mailto:Tutor@python.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
Tutor@python.org</a><br><a href="http://mail.python.org/mailman/listinfo/tutor" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://mail.python.org/mailman/listinfo/tutor</a><br></blockquote></div><br><br clear="all"><br></span></div><span class="sg">-- <br>Michael Langford<br>Phone: 404-386-0495<br>Consulting: <a href="http://www.TierOneDesign.com/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://www.TierOneDesign.com/
</a>
</span></blockquote></div><br><br clear="all"><br>-- <br>Michael Langford<br>Phone: 404-386-0495<br>Consulting: <a href="http://www.TierOneDesign.com/">http://www.TierOneDesign.com/</a>