<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>10.8. functools — Higher order functions and operations on callable objects — Python v2.6.5 documentation</title> <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '2.6.5', COLLAPSE_MODINDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <link rel="search" type="application/opensearchdescription+xml" title="Search within Python v2.6.5 documentation" href="../_static/opensearch.xml"/> <link rel="author" title="About these documents" href="../about.html" /> <link rel="copyright" title="Copyright" href="../copyright.html" /> <link rel="top" title="Python v2.6.5 documentation" href="../index.html" /> <link rel="up" title="10. Numeric and Mathematical Modules" href="numeric.html" /> <link rel="next" title="10.9. operator — Standard operators as functions" href="operator.html" /> <link rel="prev" title="10.7. itertools — Functions creating iterators for efficient looping" href="itertools.html" /> <link rel="shortcut icon" type="image/png" href="../_static/py.png" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../modindex.html" title="Global Module Index" accesskey="M">modules</a> |</li> <li class="right" > <a href="operator.html" title="10.9. operator — Standard operators as functions" accesskey="N">next</a> |</li> <li class="right" > <a href="itertools.html" title="10.7. itertools — Functions creating iterators for efficient looping" accesskey="P">previous</a> |</li> <li><img src="../_static/py.png" alt="" style="vertical-align: middle; margin-top: -1px"/></li> <li><a href="../index.html">Python v2.6.5 documentation</a> »</li> <li><a href="index.html" >The Python Standard Library</a> »</li> <li><a href="numeric.html" accesskey="U">10. Numeric and Mathematical Modules</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="module-functools"> <h1>10.8. <tt class="xref docutils literal"><span class="pre">functools</span></tt> — Higher order functions and operations on callable objects<a class="headerlink" href="#module-functools" title="Permalink to this headline">¶</a></h1> <p class="versionadded"> <span class="versionmodified">New in version 2.5.</span></p> <p>The <tt class="xref docutils literal"><span class="pre">functools</span></tt> module is for higher-order functions: functions that act on or return other functions. In general, any callable object can be treated as a function for the purposes of this module.</p> <p>The <tt class="xref docutils literal"><span class="pre">functools</span></tt> module defines the following functions:</p> <dl class="function"> <dt id="functools.reduce"> <tt class="descclassname">functools.</tt><tt class="descname">reduce</tt><big>(</big><em>function</em>, <em>iterable</em><span class="optional">[</span>, <em>initializer</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#functools.reduce" title="Permalink to this definition">¶</a></dt> <dd><p>This is the same function as <a title="reduce" class="reference external" href="functions.html#reduce"><tt class="xref docutils literal"><span class="pre">reduce()</span></tt></a>. It is made available in this module to allow writing code more forward-compatible with Python 3.</p> <p class="versionadded"> <span class="versionmodified">New in version 2.6.</span></p> </dd></dl> <dl class="function"> <dt id="functools.partial"> <tt class="descclassname">functools.</tt><tt class="descname">partial</tt><big>(</big><em>func</em><span class="optional">[</span>, <em>*args</em><span class="optional">]</span><span class="optional">[</span>, <em>**keywords</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#functools.partial" title="Permalink to this definition">¶</a></dt> <dd><p>Return a new <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> object which when called will behave like <em>func</em> called with the positional arguments <em>args</em> and keyword arguments <em>keywords</em>. If more arguments are supplied to the call, they are appended to <em>args</em>. If additional keyword arguments are supplied, they extend and override <em>keywords</em>. Roughly equivalent to:</p> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">partial</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">keywords</span><span class="p">):</span> <span class="k">def</span> <span class="nf">newfunc</span><span class="p">(</span><span class="o">*</span><span class="n">fargs</span><span class="p">,</span> <span class="o">**</span><span class="n">fkeywords</span><span class="p">):</span> <span class="n">newkeywords</span> <span class="o">=</span> <span class="n">keywords</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="n">newkeywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">fkeywords</span><span class="p">)</span> <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">args</span> <span class="o">+</span> <span class="n">fargs</span><span class="p">),</span> <span class="o">**</span><span class="n">newkeywords</span><span class="p">)</span> <span class="n">newfunc</span><span class="o">.</span><span class="n">func</span> <span class="o">=</span> <span class="n">func</span> <span class="n">newfunc</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="n">newfunc</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="n">keywords</span> <span class="k">return</span> <span class="n">newfunc</span> </pre></div> </div> <p>The <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial()</span></tt></a> is used for partial function application which “freezes” some portion of a function’s arguments and/or keywords resulting in a new object with a simplified signature. For example, <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial()</span></tt></a> can be used to create a callable that behaves like the <a title="int" class="reference external" href="functions.html#int"><tt class="xref docutils literal"><span class="pre">int()</span></tt></a> function where the <em>base</em> argument defaults to two:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">partial</span> <span class="gp">>>> </span><span class="n">basetwo</span> <span class="o">=</span> <span class="n">partial</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">base</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">basetwo</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="s">'Convert base 2 string to an int.'</span> <span class="gp">>>> </span><span class="n">basetwo</span><span class="p">(</span><span class="s">'10010'</span><span class="p">)</span> <span class="go">18</span> </pre></div> </div> </dd></dl> <dl class="function"> <dt id="functools.update_wrapper"> <tt class="descclassname">functools.</tt><tt class="descname">update_wrapper</tt><big>(</big><em>wrapper</em>, <em>wrapped</em><span class="optional">[</span>, <em>assigned</em><span class="optional">]</span><span class="optional">[</span>, <em>updated</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#functools.update_wrapper" title="Permalink to this definition">¶</a></dt> <dd><p>Update a <em>wrapper</em> function to look like the <em>wrapped</em> function. The optional arguments are tuples to specify which attributes of the original function are assigned directly to the matching attributes on the wrapper function and which attributes of the wrapper function are updated with the corresponding attributes from the original function. The default values for these arguments are the module level constants <em>WRAPPER_ASSIGNMENTS</em> (which assigns to the wrapper function’s <em>__name__</em>, <em>__module__</em> and <em>__doc__</em>, the documentation string) and <em>WRAPPER_UPDATES</em> (which updates the wrapper function’s <em>__dict__</em>, i.e. the instance dictionary).</p> <p>The main intended use for this function is in <a class="reference external" href="../glossary.html#term-decorator"><em class="xref">decorator</em></a> functions which wrap the decorated function and return the wrapper. If the wrapper function is not updated, the metadata of the returned function will reflect the wrapper definition rather than the original function definition, which is typically less than helpful.</p> </dd></dl> <dl class="function"> <dt id="functools.wraps"> <tt class="descclassname">functools.</tt><tt class="descname">wraps</tt><big>(</big><em>wrapped</em><span class="optional">[</span>, <em>assigned</em><span class="optional">]</span><span class="optional">[</span>, <em>updated</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#functools.wraps" title="Permalink to this definition">¶</a></dt> <dd><p>This is a convenience function for invoking <tt class="docutils literal"><span class="pre">partial(update_wrapper,</span> <span class="pre">wrapped=wrapped,</span> <span class="pre">assigned=assigned,</span> <span class="pre">updated=updated)</span></tt> as a function decorator when defining a wrapper function. For example:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span> <span class="gp">>>> </span><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="gp">... </span> <span class="nd">@wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="gp">... </span> <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span> <span class="gp">... </span> <span class="k">print</span> <span class="s">'Calling decorated function'</span> <span class="gp">... </span> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">)</span> <span class="gp">... </span> <span class="k">return</span> <span class="n">wrapper</span> <span class="gp">...</span> <span class="gp">>>> </span><span class="nd">@my_decorator</span> <span class="gp">... </span><span class="k">def</span> <span class="nf">example</span><span class="p">():</span> <span class="gp">... </span> <span class="sd">"""Docstring"""</span> <span class="gp">... </span> <span class="k">print</span> <span class="s">'Called example function'</span> <span class="gp">...</span> <span class="gp">>>> </span><span class="n">example</span><span class="p">()</span> <span class="go">Calling decorated function</span> <span class="go">Called example function</span> <span class="gp">>>> </span><span class="n">example</span><span class="o">.</span><span class="n">__name__</span> <span class="go">'example'</span> <span class="gp">>>> </span><span class="n">example</span><span class="o">.</span><span class="n">__doc__</span> <span class="go">'Docstring'</span> </pre></div> </div> <p>Without the use of this decorator factory, the name of the example function would have been <tt class="docutils literal"><span class="pre">'wrapper'</span></tt>, and the docstring of the original <tt class="xref docutils literal"><span class="pre">example()</span></tt> would have been lost.</p> </dd></dl> <div class="section" id="partial-objects"> <span id="id1"></span><h2>10.8.1. <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> Objects<a class="headerlink" href="#partial-objects" title="Permalink to this headline">¶</a></h2> <p><a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> objects are callable objects created by <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial()</span></tt></a>. They have three read-only attributes:</p> <dl class="attribute"> <dt id="functools.partial.func"> <tt class="descclassname">partial.</tt><tt class="descname">func</tt><a class="headerlink" href="#functools.partial.func" title="Permalink to this definition">¶</a></dt> <dd>A callable object or function. Calls to the <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> object will be forwarded to <a title="functools.partial.func" class="reference internal" href="#functools.partial.func"><tt class="xref docutils literal"><span class="pre">func</span></tt></a> with new arguments and keywords.</dd></dl> <dl class="attribute"> <dt id="functools.partial.args"> <tt class="descclassname">partial.</tt><tt class="descname">args</tt><a class="headerlink" href="#functools.partial.args" title="Permalink to this definition">¶</a></dt> <dd>The leftmost positional arguments that will be prepended to the positional arguments provided to a <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> object call.</dd></dl> <dl class="attribute"> <dt id="functools.partial.keywords"> <tt class="descclassname">partial.</tt><tt class="descname">keywords</tt><a class="headerlink" href="#functools.partial.keywords" title="Permalink to this definition">¶</a></dt> <dd>The keyword arguments that will be supplied when the <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> object is called.</dd></dl> <p><a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> objects are like <tt class="xref docutils literal"><span class="pre">function</span></tt> objects in that they are callable, weak referencable, and can have attributes. There are some important differences. For instance, the <tt class="xref docutils literal"><span class="pre">__name__</span></tt> and <tt class="xref docutils literal"><span class="pre">__doc__</span></tt> attributes are not created automatically. Also, <a title="functools.partial" class="reference internal" href="#functools.partial"><tt class="xref docutils literal"><span class="pre">partial</span></tt></a> objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up.</p> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="../contents.html">Table Of Contents</a></h3> <ul> <li><a class="reference external" href="#">10.8. <tt class="docutils literal"><span class="pre">functools</span></tt> — Higher order functions and operations on callable objects</a><ul> <li><a class="reference external" href="#partial-objects">10.8.1. <tt class="docutils literal"><span class="pre">partial</span></tt> Objects</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="itertools.html" title="previous chapter">10.7. <tt class="docutils literal"><span class="pre">itertools</span></tt> — Functions creating iterators for efficient looping</a></p> <h4>Next topic</h4> <p class="topless"><a href="operator.html" title="next chapter">10.9. <tt class="docutils literal docutils literal"><span class="pre">operator</span></tt> — Standard operators as functions</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../_sources/library/functools.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../modindex.html" title="Global Module Index" >modules</a> |</li> <li class="right" > <a href="operator.html" title="10.9. operator — Standard operators as functions" >next</a> |</li> <li class="right" > <a href="itertools.html" title="10.7. itertools — Functions creating iterators for efficient looping" >previous</a> |</li> <li><img src="../_static/py.png" alt="" style="vertical-align: middle; margin-top: -1px"/></li> <li><a href="../index.html">Python v2.6.5 documentation</a> »</li> <li><a href="index.html" >The Python Standard Library</a> »</li> <li><a href="numeric.html" >10. Numeric and Mathematical Modules</a> »</li> </ul> </div> <div class="footer"> © <a href="../copyright.html">Copyright</a> 1990-2010, Python Software Foundation. <br /> The Python Software Foundation is a non-profit corporation. <a href="http://www.python.org/psf/donations/">Please donate.</a> <br /> Last updated on Mar 19, 2010. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. </div> </body> </html>