A cool decorator I found on ActiveState is one that does memoization.<br>It caches the results of a function in a dictionary. The key is the parameters, the value is the return value of your function.<br><br>I use it for recursive function sometimes needed when trying to solve computer puzzles (Project Euler :)<br>
<br>- Benjamin<br><pre class="prettyprint lang-py"><span class="com"># <a href="http://code.activestate.com/recipes/466320/">http://code.activestate.com/recipes/466320/</a></span><span class="pln"><br></span><span class="kwd">from</span><span class="pln"> cPickle </span><span class="kwd">import</span><span class="pln"> dumps</span><span class="pun">,</span><span class="pln"> </span><span class="typ">PicklingError</span><span class="pln"> </span><span class="com"># for memoize</span><span class="pln"><br>
</span><span class="kwd">class</span><span class="pln"> memoize</span><span class="pun">(</span><span class="pln">object</span><span class="pun">):</span><span class="pln"><br></span><span class="pln">    </span><span class="str">&quot;&quot;&quot;Decorator that caches a function&#39;s return value each time it is called.<br>
</span><span class="str">    If called later with the same arguments, the cached value is returned, and<br></span><span class="str">    not re-evaluated. Slow for mutable types.&quot;&quot;&quot;</span><span class="pln"><br>
</span><span class="pln">    </span><span class="com"># Ideas from MemoizeMutable class of Recipe 52201 by Paul Moore and</span><span class="pln"><br></span><span class="pln">    </span><span class="com"># from memoized decorator of <a href="http://wiki.python.org/moin/PythonDecoratorLibrary">http://wiki.python.org/moin/PythonDecoratorLibrary</a></span><span class="pln"><br>
</span><span class="pln">    </span><span class="com"># For a version with timeout see Recipe 325905</span><span class="pln"><br></span><span class="pln">    </span><span class="com"># For a self cleaning version see Recipe 440678</span><span class="pln"><br>
</span><span class="pln">    </span><span class="com"># Weak references (a dict with weak values) can be used, like this:</span><span class="pln"><br></span><span class="pln">    </span><span class="com">#   self._cache = weakref.WeakValueDictionary()</span><span class="pln"><br>
</span><span class="pln">    </span><span class="com">#   but the keys of such dict can&#39;t be int</span><span class="pln"><br></span><span class="pln">    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> func</span><span class="pun">):</span><span class="pln"><br>
</span><span class="pln">        self</span><span class="pun">.</span><span class="pln">func </span><span class="pun">=</span><span class="pln"> func<br></span><span class="pln">        self</span><span class="pun">.</span><span class="pln">_cache </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln"><br>
</span><span class="pln">    </span><span class="kwd">def</span><span class="pln"> __call__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> </span><span class="pun">*</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwds</span><span class="pun">):</span><span class="pln"><br>
</span><span class="pln">        key </span><span class="pun">=</span><span class="pln"> args<br></span><span class="pln">        </span><span class="kwd">if</span><span class="pln"> kwds</span><span class="pun">:</span><span class="pln"><br>
</span><span class="pln">            items </span><span class="pun">=</span><span class="pln"> kwds</span><span class="pun">.</span><span class="pln">items</span><span class="pun">()</span><span class="pln"><br></span><span class="pln">            items</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">()</span><span class="pln"><br>
</span><span class="pln">            key </span><span class="pun">=</span><span class="pln"> key </span><span class="pun">+</span><span class="pln"> tuple</span><span class="pun">(</span><span class="pln">items</span><span class="pun">)</span><span class="pln"><br>
</span><span class="pln">        </span><span class="kwd">try</span><span class="pun">:</span><span class="pln"><br></span><span class="pln">            </span><span class="kwd">if</span><span class="pln"> key </span><span class="kwd">in</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">:</span><span class="pln"><br>
</span><span class="pln">                </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">[</span><span class="pln">key</span><span class="pun">]</span><span class="pln"><br>
</span><span class="pln">            self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">[</span><span class="pln">key</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">func</span><span class="pun">(*</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwds</span><span class="pun">)</span><span class="pln"><br>
</span><span class="pln">            </span><span class="kwd">return</span><span class="pln"> result<br></span><span class="pln">        </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">TypeError</span><span class="pun">:</span><span class="pln"><br>
</span><span class="pln">            </span><span class="kwd">try</span><span class="pun">:</span><span class="pln"><br></span><span class="pln">                dump </span><span class="pun">=</span><span class="pln"> dumps</span><span class="pun">(</span><span class="pln">key</span><span class="pun">)</span><span class="pln"><br>
</span><span class="pln">            </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">PicklingError</span><span class="pun">:</span><span class="pln"><br></span><span class="pln">                </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">func</span><span class="pun">(*</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwds</span><span class="pun">)</span><span class="pln"><br>
</span><span class="pln">            </span><span class="kwd">else</span><span class="pun">:</span><span class="pln"><br></span><span class="pln">                </span><span class="kwd">if</span><span class="pln"> dump </span><span class="kwd">in</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">:</span><span class="pln"><br>
</span><span class="pln">                    </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">[</span><span class="pln">dump</span><span class="pun">]</span><span class="pln"><br>
</span><span class="pln">                self</span><span class="pun">.</span><span class="pln">_cache</span><span class="pun">[</span><span class="pln">dump</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">func</span><span class="pun">(*</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwds</span><span class="pun">)</span><span class="pln"><br>
</span><span class="pln">                </span><span class="kwd">return</span><span class="pln"> result</span></pre><br><br><div class="gmail_quote">On Thu, Feb 26, 2009 at 3:58 PM, Asheesh Laroia <span dir="ltr">&lt;<a href="mailto:asheesh@asheesh.org">asheesh@asheesh.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">On Wed, 25 Feb 2009, Charles Merriam wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
In the spirit of just in time research for the newbie nugget tomorrow:<br>
<br>
What decorators do most people actually use?<br>
</blockquote>
<br></div>
I *frequently* use a @trace decorator. It reminds me of the lovely days of the TRACE macro in Common Lisp. I typically write my own, but given a good standard-ish one I could use that.<br>
<br>
-- Asheesh.<br><font color="#888888">
<br>
-- <br>
Of course you have a purpose -- to find a purpose.</font><div><div></div><div class="Wj3C7c"><br>
_______________________________________________<br>
Baypiggies mailing list<br>
<a href="mailto:Baypiggies@python.org" target="_blank">Baypiggies@python.org</a><br>
To change your subscription options or unsubscribe:<br>
<a href="http://mail.python.org/mailman/listinfo/baypiggies" target="_blank">http://mail.python.org/mailman/listinfo/baypiggies</a><br>
</div></div></blockquote></div><br>