mirror of
				https://github.com/bunny-lab-io/Borealis.git
				synced 2025-11-03 19:01:57 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			1461 lines
		
	
	
		
			144 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			1461 lines
		
	
	
		
			144 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						||
 | 
						||
<html lang="en" data-content_root="../">
 | 
						||
  <head>
 | 
						||
    <meta charset="utf-8" />
 | 
						||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
 | 
						||
<meta property="og:title" content="What’s New in Python 2.2" />
 | 
						||
<meta property="og:type" content="website" />
 | 
						||
<meta property="og:url" content="https://docs.python.org/3/whatsnew/2.2.html" />
 | 
						||
<meta property="og:site_name" content="Python documentation" />
 | 
						||
<meta property="og:description" content="Author, A.M. Kuchling,. Introduction: This article explains the new features in Python 2.2.2, released on October 14, 2002. Python 2.2.2 is a bugfix release of Python 2.2, originally released on De..." />
 | 
						||
<meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
 | 
						||
<meta property="og:image:alt" content="Python documentation" />
 | 
						||
<meta name="description" content="Author, A.M. Kuchling,. Introduction: This article explains the new features in Python 2.2.2, released on October 14, 2002. Python 2.2.2 is a bugfix release of Python 2.2, originally released on De..." />
 | 
						||
<meta property="og:image:width" content="200">
 | 
						||
<meta property="og:image:height" content="200">
 | 
						||
<meta name="theme-color" content="#3776ab">
 | 
						||
 | 
						||
    <title>What’s New in Python 2.2 — Python 3.13.3 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
						||
    
 | 
						||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
 | 
						||
    <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=23252803" />
 | 
						||
    <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />
 | 
						||
    
 | 
						||
    <script src="../_static/documentation_options.js?v=5d57ca2d"></script>
 | 
						||
    <script src="../_static/doctools.js?v=9bcbadda"></script>
 | 
						||
    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
 | 
						||
    
 | 
						||
    <script src="../_static/sidebar.js"></script>
 | 
						||
    
 | 
						||
    <link rel="search" type="application/opensearchdescription+xml"
 | 
						||
          title="Search within Python 3.13.3 documentation"
 | 
						||
          href="../_static/opensearch.xml"/>
 | 
						||
    <link rel="author" title="About these documents" href="../about.html" />
 | 
						||
    <link rel="index" title="Index" href="../genindex.html" />
 | 
						||
    <link rel="search" title="Search" href="../search.html" />
 | 
						||
    <link rel="copyright" title="Copyright" href="../copyright.html" />
 | 
						||
    <link rel="next" title="What’s New in Python 2.1" href="2.1.html" />
 | 
						||
    <link rel="prev" title="What’s New in Python 2.3" href="2.3.html" />
 | 
						||
    
 | 
						||
    <link rel="canonical" href="https://docs.python.org/3/whatsnew/2.2.html">
 | 
						||
    
 | 
						||
      
 | 
						||
    
 | 
						||
 | 
						||
    
 | 
						||
    <style>
 | 
						||
      @media only screen {
 | 
						||
        table.full-width-table {
 | 
						||
            width: 100%;
 | 
						||
        }
 | 
						||
      }
 | 
						||
    </style>
 | 
						||
<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
 | 
						||
    <link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
 | 
						||
            <script type="text/javascript" src="../_static/copybutton.js"></script>
 | 
						||
            <script type="text/javascript" src="../_static/menu.js"></script>
 | 
						||
            <script type="text/javascript" src="../_static/search-focus.js"></script>
 | 
						||
            <script type="text/javascript" src="../_static/themetoggle.js"></script> 
 | 
						||
            <script type="text/javascript" src="../_static/rtd_switcher.js"></script>
 | 
						||
            <meta name="readthedocs-addons-api-version" content="1">
 | 
						||
 | 
						||
  </head>
 | 
						||
<body>
 | 
						||
<div class="mobile-nav">
 | 
						||
    <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
 | 
						||
           aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
 | 
						||
    <nav class="nav-content" role="navigation">
 | 
						||
        <label for="menuToggler" class="toggler__label">
 | 
						||
            <span></span>
 | 
						||
        </label>
 | 
						||
        <span class="nav-items-wrapper">
 | 
						||
            <a href="https://www.python.org/" class="nav-logo">
 | 
						||
                <img src="../_static/py.svg" alt="Python logo"/>
 | 
						||
            </a>
 | 
						||
            <span class="version_switcher_placeholder"></span>
 | 
						||
            <form role="search" class="search" action="../search.html" method="get">
 | 
						||
                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
 | 
						||
                    <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
 | 
						||
                </svg>
 | 
						||
                <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
 | 
						||
                <input type="submit" value="Go"/>
 | 
						||
            </form>
 | 
						||
        </span>
 | 
						||
    </nav>
 | 
						||
    <div class="menu-wrapper">
 | 
						||
        <nav class="menu" role="navigation" aria-label="main navigation">
 | 
						||
            <div class="language_switcher_placeholder"></div>
 | 
						||
            
 | 
						||
<label class="theme-selector-label">
 | 
						||
    Theme
 | 
						||
    <select class="theme-selector" oninput="activateTheme(this.value)">
 | 
						||
        <option value="auto" selected>Auto</option>
 | 
						||
        <option value="light">Light</option>
 | 
						||
        <option value="dark">Dark</option>
 | 
						||
    </select>
 | 
						||
</label>
 | 
						||
  <div>
 | 
						||
    <h3><a href="../contents.html">Table of Contents</a></h3>
 | 
						||
    <ul>
 | 
						||
<li><a class="reference internal" href="#">What’s New in Python 2.2</a><ul>
 | 
						||
<li><a class="reference internal" href="#introduction">Introduction</a></li>
 | 
						||
<li><a class="reference internal" href="#peps-252-and-253-type-and-class-changes">PEPs 252 and 253: Type and Class Changes</a><ul>
 | 
						||
<li><a class="reference internal" href="#old-and-new-classes">Old and New Classes</a></li>
 | 
						||
<li><a class="reference internal" href="#descriptors">Descriptors</a></li>
 | 
						||
<li><a class="reference internal" href="#multiple-inheritance-the-diamond-rule">Multiple Inheritance: The Diamond Rule</a></li>
 | 
						||
<li><a class="reference internal" href="#attribute-access">Attribute Access</a></li>
 | 
						||
<li><a class="reference internal" href="#related-links">Related Links</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li><a class="reference internal" href="#pep-234-iterators">PEP 234: Iterators</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-255-simple-generators">PEP 255: Simple Generators</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-237-unifying-long-integers-and-integers">PEP 237: Unifying Long Integers and Integers</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-238-changing-the-division-operator">PEP 238: Changing the Division Operator</a></li>
 | 
						||
<li><a class="reference internal" href="#unicode-changes">Unicode Changes</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-227-nested-scopes">PEP 227: Nested Scopes</a></li>
 | 
						||
<li><a class="reference internal" href="#new-and-improved-modules">New and Improved Modules</a></li>
 | 
						||
<li><a class="reference internal" href="#interpreter-changes-and-fixes">Interpreter Changes and Fixes</a></li>
 | 
						||
<li><a class="reference internal" href="#other-changes-and-fixes">Other Changes and Fixes</a></li>
 | 
						||
<li><a class="reference internal" href="#acknowledgements">Acknowledgements</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
</ul>
 | 
						||
 | 
						||
  </div>
 | 
						||
  <div>
 | 
						||
    <h4>Previous topic</h4>
 | 
						||
    <p class="topless"><a href="2.3.html"
 | 
						||
                          title="previous chapter">What’s New in Python 2.3</a></p>
 | 
						||
  </div>
 | 
						||
  <div>
 | 
						||
    <h4>Next topic</h4>
 | 
						||
    <p class="topless"><a href="2.1.html"
 | 
						||
                          title="next chapter">What’s New in Python 2.1</a></p>
 | 
						||
  </div>
 | 
						||
  <div role="note" aria-label="source link">
 | 
						||
    <h3>This Page</h3>
 | 
						||
    <ul class="this-page-menu">
 | 
						||
      <li><a href="../bugs.html">Report a Bug</a></li>
 | 
						||
      <li>
 | 
						||
        <a href="https://github.com/python/cpython/blob/main/Doc/whatsnew/2.2.rst"
 | 
						||
            rel="nofollow">Show Source
 | 
						||
        </a>
 | 
						||
      </li>
 | 
						||
    </ul>
 | 
						||
  </div>
 | 
						||
        </nav>
 | 
						||
    </div>
 | 
						||
</div>
 | 
						||
 | 
						||
  
 | 
						||
    <div class="related" role="navigation" aria-label="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="../py-modindex.html" title="Python Module Index"
 | 
						||
             >modules</a> |</li>
 | 
						||
        <li class="right" >
 | 
						||
          <a href="2.1.html" title="What’s New in Python 2.1"
 | 
						||
             accesskey="N">next</a> |</li>
 | 
						||
        <li class="right" >
 | 
						||
          <a href="2.3.html" title="What’s New in Python 2.3"
 | 
						||
             accesskey="P">previous</a> |</li>
 | 
						||
 | 
						||
          <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
 | 
						||
          <li><a href="https://www.python.org/">Python</a> »</li>
 | 
						||
          <li class="switchers">
 | 
						||
            <div class="language_switcher_placeholder"></div>
 | 
						||
            <div class="version_switcher_placeholder"></div>
 | 
						||
          </li>
 | 
						||
          <li>
 | 
						||
              
 | 
						||
          </li>
 | 
						||
    <li id="cpython-language-and-version">
 | 
						||
      <a href="../index.html">3.13.3 Documentation</a> »
 | 
						||
    </li>
 | 
						||
 | 
						||
          <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">What’s New in Python</a> »</li>
 | 
						||
        <li class="nav-item nav-item-this"><a href="">What’s New in Python 2.2</a></li>
 | 
						||
                <li class="right">
 | 
						||
                    
 | 
						||
 | 
						||
    <div class="inline-search" role="search">
 | 
						||
        <form class="inline-search" action="../search.html" method="get">
 | 
						||
          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
 | 
						||
          <input type="submit" value="Go" />
 | 
						||
        </form>
 | 
						||
    </div>
 | 
						||
                     |
 | 
						||
                </li>
 | 
						||
            <li class="right">
 | 
						||
<label class="theme-selector-label">
 | 
						||
    Theme
 | 
						||
    <select class="theme-selector" oninput="activateTheme(this.value)">
 | 
						||
        <option value="auto" selected>Auto</option>
 | 
						||
        <option value="light">Light</option>
 | 
						||
        <option value="dark">Dark</option>
 | 
						||
    </select>
 | 
						||
</label> |</li>
 | 
						||
            
 | 
						||
      </ul>
 | 
						||
    </div>    
 | 
						||
 | 
						||
    <div class="document">
 | 
						||
      <div class="documentwrapper">
 | 
						||
        <div class="bodywrapper">
 | 
						||
          <div class="body" role="main">
 | 
						||
            
 | 
						||
  <section id="what-s-new-in-python-2-2">
 | 
						||
<h1>What’s New in Python 2.2<a class="headerlink" href="#what-s-new-in-python-2-2" title="Link to this heading">¶</a></h1>
 | 
						||
<dl class="field-list simple">
 | 
						||
<dt class="field-odd">Author<span class="colon">:</span></dt>
 | 
						||
<dd class="field-odd"><p>A.M. Kuchling</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
<section id="introduction">
 | 
						||
<h2>Introduction<a class="headerlink" href="#introduction" title="Link to this heading">¶</a></h2>
 | 
						||
<p>This article explains the new features in Python 2.2.2, released on October 14,
 | 
						||
2002.  Python 2.2.2 is a bugfix release of Python 2.2, originally released on
 | 
						||
December 21, 2001.</p>
 | 
						||
<p>Python 2.2 can be thought of as the “cleanup release”.  There are some features
 | 
						||
such as generators and iterators that are completely new, but most of the
 | 
						||
changes, significant and far-reaching though they may be, are aimed at cleaning
 | 
						||
up irregularities and dark corners of the language design.</p>
 | 
						||
<p>This article doesn’t attempt to provide a complete specification of the new
 | 
						||
features, but instead provides a convenient overview.  For full details, you
 | 
						||
should refer to the documentation for Python 2.2, such as the <a class="reference external" href="https://docs.python.org/2.2/lib/lib.html">Python Library
 | 
						||
Reference</a> and the <a class="reference external" href="https://docs.python.org/2.2/ref/ref.html">Python
 | 
						||
Reference Manual</a>.  If you want to
 | 
						||
understand the complete implementation and design rationale for a change, refer
 | 
						||
to the PEP for a particular new feature.</p>
 | 
						||
</section>
 | 
						||
<section id="peps-252-and-253-type-and-class-changes">
 | 
						||
<h2>PEPs 252 and 253: Type and Class Changes<a class="headerlink" href="#peps-252-and-253-type-and-class-changes" title="Link to this heading">¶</a></h2>
 | 
						||
<p>The largest and most far-reaching changes in Python 2.2 are to Python’s model of
 | 
						||
objects and classes.  The changes should be backward compatible, so it’s likely
 | 
						||
that your code will continue to run unchanged, but the changes provide some
 | 
						||
amazing new capabilities. Before beginning this, the longest and most
 | 
						||
complicated section of this article, I’ll provide an overview of the changes and
 | 
						||
offer some comments.</p>
 | 
						||
<p>A long time ago I wrote a web page listing flaws in Python’s design.  One of the
 | 
						||
most significant flaws was that it’s impossible to subclass Python types
 | 
						||
implemented in C.  In particular, it’s not possible to subclass built-in types,
 | 
						||
so you can’t just subclass, say, lists in order to add a single useful method to
 | 
						||
them. The <code class="xref py py-mod docutils literal notranslate"><span class="pre">UserList</span></code> module provides a class that supports all of the
 | 
						||
methods of lists and that can be subclassed further, but there’s lots of C code
 | 
						||
that expects a regular Python list and won’t accept a <a class="reference internal" href="../library/collections.html#collections.UserList" title="collections.UserList"><code class="xref py py-class docutils literal notranslate"><span class="pre">UserList</span></code></a>
 | 
						||
instance.</p>
 | 
						||
<p>Python 2.2 fixes this, and in the process adds some exciting new capabilities.
 | 
						||
A brief summary:</p>
 | 
						||
<ul class="simple">
 | 
						||
<li><p>You can subclass built-in types such as lists and even integers, and your
 | 
						||
subclasses should work in every place that requires the original type.</p></li>
 | 
						||
<li><p>It’s now possible to define static and class methods, in addition to the
 | 
						||
instance methods available in previous versions of Python.</p></li>
 | 
						||
<li><p>It’s also possible to automatically call methods on accessing or setting an
 | 
						||
instance attribute by using a new mechanism called <em class="dfn">properties</em>.  Many uses
 | 
						||
of <a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code></a> can be rewritten to use properties instead, making the
 | 
						||
resulting code simpler and faster.  As a small side benefit, attributes can now
 | 
						||
have docstrings, too.</p></li>
 | 
						||
<li><p>The list of legal attributes for an instance can be limited to a particular
 | 
						||
set using <em class="dfn">slots</em>, making it possible to safeguard against typos and
 | 
						||
perhaps make more optimizations possible in future versions of Python.</p></li>
 | 
						||
</ul>
 | 
						||
<p>Some users have voiced concern about all these changes.  Sure, they say, the new
 | 
						||
features are neat and lend themselves to all sorts of tricks that weren’t
 | 
						||
possible in previous versions of Python, but they also make the language more
 | 
						||
complicated.  Some people have said that they’ve always recommended Python for
 | 
						||
its simplicity, and feel that its simplicity is being lost.</p>
 | 
						||
<p>Personally, I think there’s no need to worry.  Many of the new features are
 | 
						||
quite esoteric, and you can write a lot of Python code without ever needed to be
 | 
						||
aware of them.  Writing a simple class is no more difficult than it ever was, so
 | 
						||
you don’t need to bother learning or teaching them unless they’re actually
 | 
						||
needed.  Some very complicated tasks that were previously only possible from C
 | 
						||
will now be possible in pure Python, and to my mind that’s all for the better.</p>
 | 
						||
<p>I’m not going to attempt to cover every single corner case and small change that
 | 
						||
were required to make the new features work.  Instead this section will paint
 | 
						||
only the broad strokes.  See section <a class="reference internal" href="#sect-rellinks"><span class="std std-ref">Related Links</span></a>, “Related Links”, for
 | 
						||
further sources of information about Python 2.2’s new object model.</p>
 | 
						||
<section id="old-and-new-classes">
 | 
						||
<h3>Old and New Classes<a class="headerlink" href="#old-and-new-classes" title="Link to this heading">¶</a></h3>
 | 
						||
<p>First, you should know that Python 2.2 really has two kinds of classes: classic
 | 
						||
or old-style classes, and new-style classes.  The old-style class model is
 | 
						||
exactly the same as the class model in earlier versions of Python.  All the new
 | 
						||
features described in this section apply only to new-style classes. This
 | 
						||
divergence isn’t intended to last forever; eventually old-style classes will be
 | 
						||
dropped, possibly in Python 3.0.</p>
 | 
						||
<p>So how do you define a new-style class?  You do it by subclassing an existing
 | 
						||
new-style class.  Most of Python’s built-in types, such as integers, lists,
 | 
						||
dictionaries, and even files, are new-style classes now.  A new-style class
 | 
						||
named <a class="reference internal" href="../library/functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a>, the base class for all built-in types, has also been
 | 
						||
added so if no built-in type is suitable, you can just subclass
 | 
						||
<a class="reference internal" href="../library/functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a>:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
    <span class="o">...</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>This means that <a class="reference internal" href="../reference/compound_stmts.html#class"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">class</span></code></a> statements that don’t have any base classes are
 | 
						||
always classic classes in Python 2.2.  (Actually you can also change this by
 | 
						||
setting a module-level variable named <code class="xref py py-attr docutils literal notranslate"><span class="pre">__metaclass__</span></code> — see <span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0253/"><strong>PEP 253</strong></a>
 | 
						||
for the details — but it’s easier to just subclass <a class="reference internal" href="../library/functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a>.)</p>
 | 
						||
<p>The type objects for the built-in types are available as built-ins, named using
 | 
						||
a clever trick.  Python has always had built-in functions named <a class="reference internal" href="../library/functions.html#int" title="int"><code class="xref py py-func docutils literal notranslate"><span class="pre">int()</span></code></a>,
 | 
						||
<a class="reference internal" href="../library/functions.html#float" title="float"><code class="xref py py-func docutils literal notranslate"><span class="pre">float()</span></code></a>, and <a class="reference internal" href="../library/stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a>.  In 2.2, they aren’t functions any more, but
 | 
						||
type objects that behave as factories when called.</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">int</span>
 | 
						||
<span class="go"><type 'int'></span>
 | 
						||
<span class="gp">>>> </span><span class="nb">int</span><span class="p">(</span><span class="s1">'123'</span><span class="p">)</span>
 | 
						||
<span class="go">123</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>To make the set of types complete, new type objects such as <a class="reference internal" href="../library/stdtypes.html#dict" title="dict"><code class="xref py py-func docutils literal notranslate"><span class="pre">dict()</span></code></a> and
 | 
						||
<code class="xref py py-func docutils literal notranslate"><span class="pre">file()</span></code> have been added.  Here’s a more interesting example, adding a
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">lock()</span></code> method to file objects:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">LockableFile</span><span class="p">(</span><span class="n">file</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">lock</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">operation</span><span class="p">,</span> <span class="n">length</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">whence</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
 | 
						||
        <span class="kn">import</span><span class="w"> </span><span class="nn">fcntl</span>
 | 
						||
        <span class="k">return</span> <span class="n">fcntl</span><span class="o">.</span><span class="n">lockf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fileno</span><span class="p">(),</span> <span class="n">operation</span><span class="p">,</span>
 | 
						||
                           <span class="n">length</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">whence</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The now-obsolete <code class="xref py py-mod docutils literal notranslate"><span class="pre">posixfile</span></code> module contained a class that emulated all of
 | 
						||
a file object’s methods and also added a <code class="xref py py-meth docutils literal notranslate"><span class="pre">lock()</span></code> method, but this class
 | 
						||
couldn’t be passed to internal functions that expected a built-in file,
 | 
						||
something which is possible with our new <code class="xref py py-class docutils literal notranslate"><span class="pre">LockableFile</span></code>.</p>
 | 
						||
</section>
 | 
						||
<section id="descriptors">
 | 
						||
<h3>Descriptors<a class="headerlink" href="#descriptors" title="Link to this heading">¶</a></h3>
 | 
						||
<p>In previous versions of Python, there was no consistent way to discover what
 | 
						||
attributes and methods were supported by an object. There were some informal
 | 
						||
conventions, such as defining <code class="xref py py-attr docutils literal notranslate"><span class="pre">__members__</span></code> and <code class="xref py py-attr docutils literal notranslate"><span class="pre">__methods__</span></code>
 | 
						||
attributes that were lists of names, but often the author of an extension type
 | 
						||
or a class wouldn’t bother to define them.  You could fall back on inspecting
 | 
						||
the <a class="reference internal" href="../reference/datamodel.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a> of an object, but when class inheritance or an arbitrary
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code> hook were in use this could still be inaccurate.</p>
 | 
						||
<p>The one big idea underlying the new class model is that an API for describing
 | 
						||
the attributes of an object using <em class="dfn">descriptors</em> has been formalized.
 | 
						||
Descriptors specify the value of an attribute, stating whether it’s a method or
 | 
						||
a field.  With the descriptor API, static methods and class methods become
 | 
						||
possible, as well as more exotic constructs.</p>
 | 
						||
<p>Attribute descriptors are objects that live inside class objects, and have a few
 | 
						||
attributes of their own:</p>
 | 
						||
<ul class="simple">
 | 
						||
<li><p><a class="reference internal" href="../library/stdtypes.html#definition.__name__" title="definition.__name__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__name__</span></code></a> is the attribute’s name.</p></li>
 | 
						||
<li><p><a class="reference internal" href="../library/stdtypes.html#definition.__doc__" title="definition.__doc__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__doc__</span></code></a> is the attribute’s docstring.</p></li>
 | 
						||
<li><p><code class="docutils literal notranslate"><span class="pre">__get__(object)</span></code> is a method that retrieves the attribute value from
 | 
						||
<em>object</em>.</p></li>
 | 
						||
<li><p><code class="docutils literal notranslate"><span class="pre">__set__(object,</span> <span class="pre">value)</span></code> sets the attribute on <em>object</em> to <em>value</em>.</p></li>
 | 
						||
<li><p><code class="docutils literal notranslate"><span class="pre">__delete__(object,</span> <span class="pre">value)</span></code> deletes the <em>value</em>  attribute of <em>object</em>.</p></li>
 | 
						||
</ul>
 | 
						||
<p>For example, when you write <code class="docutils literal notranslate"><span class="pre">obj.x</span></code>, the steps that Python actually performs
 | 
						||
are:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">descriptor</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">x</span>
 | 
						||
<span class="n">descriptor</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>For methods, <a class="reference internal" href="../reference/datamodel.html#object.__get__" title="object.__get__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">descriptor.__get__</span></code></a> returns a temporary
 | 
						||
object that’s
 | 
						||
callable, and wraps up the instance and the method to be called on it. This is
 | 
						||
also why static methods and class methods are now possible; they have
 | 
						||
descriptors that wrap up just the method, or the method and the class.  As a
 | 
						||
brief explanation of these new kinds of methods, static methods aren’t passed
 | 
						||
the instance, and therefore resemble regular functions.  Class methods are
 | 
						||
passed the class of the object, but not the object itself.  Static and class
 | 
						||
methods are defined like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
    <span class="n">f</span> <span class="o">=</span> <span class="nb">staticmethod</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
 | 
						||
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">g</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
    <span class="n">g</span> <span class="o">=</span> <span class="nb">classmethod</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The <a class="reference internal" href="../library/functions.html#staticmethod" title="staticmethod"><code class="xref py py-func docutils literal notranslate"><span class="pre">staticmethod()</span></code></a> function takes the function <code class="xref py py-func docutils literal notranslate"><span class="pre">f()</span></code>, and returns it
 | 
						||
wrapped up in a descriptor so it can be stored in the class object.  You might
 | 
						||
expect there to be special syntax for creating such methods (<code class="docutils literal notranslate"><span class="pre">def</span> <span class="pre">static</span> <span class="pre">f</span></code>,
 | 
						||
<code class="docutils literal notranslate"><span class="pre">defstatic</span> <span class="pre">f()</span></code>, or something like that) but no such syntax has been defined
 | 
						||
yet; that’s been left for future versions of Python.</p>
 | 
						||
<p>More new features, such as slots and properties, are also implemented as new
 | 
						||
kinds of descriptors, and it’s not difficult to write a descriptor class that
 | 
						||
does something novel.  For example, it would be possible to write a descriptor
 | 
						||
class that made it possible to write Eiffel-style preconditions and
 | 
						||
postconditions for a method.  A class that used this feature might be defined
 | 
						||
like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">eiffel</span><span class="w"> </span><span class="kn">import</span> <span class="n">eiffelmethod</span>
 | 
						||
 | 
						||
<span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
 | 
						||
        <span class="c1"># The actual function</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">pre_f</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						||
        <span class="c1"># Check preconditions</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">post_f</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						||
        <span class="c1"># Check postconditions</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
 | 
						||
    <span class="n">f</span> <span class="o">=</span> <span class="n">eiffelmethod</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">pre_f</span><span class="p">,</span> <span class="n">post_f</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Note that a person using the new <code class="xref py py-func docutils literal notranslate"><span class="pre">eiffelmethod()</span></code> doesn’t have to understand
 | 
						||
anything about descriptors.  This is why I think the new features don’t increase
 | 
						||
the basic complexity of the language. There will be a few wizards who need to
 | 
						||
know about it in order to write <code class="xref py py-func docutils literal notranslate"><span class="pre">eiffelmethod()</span></code> or the ZODB or whatever,
 | 
						||
but most users will just write code on top of the resulting libraries and ignore
 | 
						||
the implementation details.</p>
 | 
						||
</section>
 | 
						||
<section id="multiple-inheritance-the-diamond-rule">
 | 
						||
<h3>Multiple Inheritance: The Diamond Rule<a class="headerlink" href="#multiple-inheritance-the-diamond-rule" title="Link to this heading">¶</a></h3>
 | 
						||
<p>Multiple inheritance has also been made more useful through changing the rules
 | 
						||
under which names are resolved.  Consider this set of classes (diagram taken
 | 
						||
from <span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0253/"><strong>PEP 253</strong></a> by Guido van Rossum):</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span>      <span class="k">class</span><span class="w"> </span><span class="nc">A</span><span class="p">:</span>
 | 
						||
        <span class="o">^</span> <span class="o">^</span>  <span class="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="o">...</span>
 | 
						||
       <span class="o">/</span>   \
 | 
						||
      <span class="o">/</span>     \
 | 
						||
     <span class="o">/</span>       \
 | 
						||
    <span class="o">/</span>         \
 | 
						||
<span class="k">class</span><span class="w"> </span><span class="nc">B</span>     <span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">:</span>
 | 
						||
    <span class="o">^</span>         <span class="o">^</span>  <span class="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="o">...</span>
 | 
						||
     \       <span class="o">/</span>
 | 
						||
      \     <span class="o">/</span>
 | 
						||
       \   <span class="o">/</span>
 | 
						||
        \ <span class="o">/</span>
 | 
						||
      <span class="k">class</span><span class="w"> </span><span class="nc">D</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The lookup rule for classic classes is simple but not very smart; the base
 | 
						||
classes are searched depth-first, going from left to right.  A reference to
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">D.save()</span></code> will search the classes <code class="xref py py-class docutils literal notranslate"><span class="pre">D</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">B</span></code>, and then
 | 
						||
<code class="xref py py-class docutils literal notranslate"><span class="pre">A</span></code>, where <code class="xref py py-meth docutils literal notranslate"><span class="pre">save()</span></code> would be found and returned.  <code class="xref py py-meth docutils literal notranslate"><span class="pre">C.save()</span></code>
 | 
						||
would never be found at all.  This is bad, because if <code class="xref py py-class docutils literal notranslate"><span class="pre">C</span></code>’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">save()</span></code>
 | 
						||
method is saving some internal state specific to <code class="xref py py-class docutils literal notranslate"><span class="pre">C</span></code>, not calling it will
 | 
						||
result in that state never getting saved.</p>
 | 
						||
<p>New-style classes follow a different algorithm that’s a bit more complicated to
 | 
						||
explain, but does the right thing in this situation. (Note that Python 2.3
 | 
						||
changes this algorithm to one that produces the same results in most cases, but
 | 
						||
produces more useful results for really complicated inheritance graphs.)</p>
 | 
						||
<ol class="arabic simple">
 | 
						||
<li><p>List all the base classes, following the classic lookup rule and include a
 | 
						||
class multiple times if it’s visited repeatedly.  In the above example, the list
 | 
						||
of visited classes is [<code class="xref py py-class docutils literal notranslate"><span class="pre">D</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">B</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">A</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">C</span></code>,
 | 
						||
<code class="xref py py-class docutils literal notranslate"><span class="pre">A</span></code>].</p></li>
 | 
						||
<li><p>Scan the list for duplicated classes.  If any are found, remove all but one
 | 
						||
occurrence, leaving the <em>last</em> one in the list.  In the above example, the list
 | 
						||
becomes [<code class="xref py py-class docutils literal notranslate"><span class="pre">D</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">B</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">C</span></code>, <code class="xref py py-class docutils literal notranslate"><span class="pre">A</span></code>] after dropping
 | 
						||
duplicates.</p></li>
 | 
						||
</ol>
 | 
						||
<p>Following this rule, referring to <code class="xref py py-meth docutils literal notranslate"><span class="pre">D.save()</span></code> will return <code class="xref py py-meth docutils literal notranslate"><span class="pre">C.save()</span></code>,
 | 
						||
which is the behaviour we’re after.  This lookup rule is the same as the one
 | 
						||
followed by Common Lisp.  A new built-in function, <a class="reference internal" href="../library/functions.html#super" title="super"><code class="xref py py-func docutils literal notranslate"><span class="pre">super()</span></code></a>, provides a way
 | 
						||
to get at a class’s superclasses without having to reimplement Python’s
 | 
						||
algorithm. The most commonly used form will be  <code class="docutils literal notranslate"><span class="pre">super(class,</span> <span class="pre">obj)</span></code>, which
 | 
						||
returns  a bound superclass object (not the actual class object).  This form
 | 
						||
will be used in methods to call a method in the superclass; for example,
 | 
						||
<code class="xref py py-class docutils literal notranslate"><span class="pre">D</span></code>’s <code class="xref py py-meth docutils literal notranslate"><span class="pre">save()</span></code> method would look like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">D</span> <span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="n">C</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">save</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						||
        <span class="c1"># Call superclass .save()</span>
 | 
						||
        <span class="nb">super</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
 | 
						||
        <span class="c1"># Save D's private information here</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p><a class="reference internal" href="../library/functions.html#super" title="super"><code class="xref py py-func docutils literal notranslate"><span class="pre">super()</span></code></a> can also return unbound superclass objects when called as
 | 
						||
<code class="docutils literal notranslate"><span class="pre">super(class)</span></code> or <code class="docutils literal notranslate"><span class="pre">super(class1,</span> <span class="pre">class2)</span></code>, but this probably won’t
 | 
						||
often be useful.</p>
 | 
						||
</section>
 | 
						||
<section id="attribute-access">
 | 
						||
<h3>Attribute Access<a class="headerlink" href="#attribute-access" title="Link to this heading">¶</a></h3>
 | 
						||
<p>A fair number of sophisticated Python classes define hooks for attribute access
 | 
						||
using <a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code></a>; most commonly this is done for convenience, to make
 | 
						||
code more readable by automatically mapping an attribute access such as
 | 
						||
<code class="docutils literal notranslate"><span class="pre">obj.parent</span></code> into a method call such as <code class="docutils literal notranslate"><span class="pre">obj.get_parent</span></code>.  Python 2.2 adds
 | 
						||
some new ways of controlling attribute access.</p>
 | 
						||
<p>First, <code class="docutils literal notranslate"><span class="pre">__getattr__(attr_name)</span></code> is still supported by new-style classes,
 | 
						||
and nothing about it has changed.  As before, it will be called when an attempt
 | 
						||
is made to access <code class="docutils literal notranslate"><span class="pre">obj.foo</span></code> and no attribute named <code class="docutils literal notranslate"><span class="pre">foo</span></code> is found in the
 | 
						||
instance’s dictionary.</p>
 | 
						||
<p>New-style classes also support a new method,
 | 
						||
<code class="docutils literal notranslate"><span class="pre">__getattribute__(attr_name)</span></code>.  The difference between the two methods is
 | 
						||
that <a class="reference internal" href="../reference/datamodel.html#object.__getattribute__" title="object.__getattribute__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattribute__()</span></code></a> is <em>always</em> called whenever any attribute is
 | 
						||
accessed, while the old <a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code></a> is only called if <code class="docutils literal notranslate"><span class="pre">foo</span></code> isn’t
 | 
						||
found in the instance’s dictionary.</p>
 | 
						||
<p>However, Python 2.2’s support for <em class="dfn">properties</em> will often be a simpler way
 | 
						||
to trap attribute references.  Writing a <code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code> method is
 | 
						||
complicated because to avoid recursion you can’t use regular attribute accesses
 | 
						||
inside them, and instead have to mess around with the contents of
 | 
						||
<a class="reference internal" href="../reference/datamodel.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a>. <a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code></a> methods also end up being called by Python
 | 
						||
when it checks for other methods such as <a class="reference internal" href="../reference/datamodel.html#object.__repr__" title="object.__repr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__repr__()</span></code></a> or <code class="xref py py-meth docutils literal notranslate"><span class="pre">__coerce__()</span></code>,
 | 
						||
and so have to be written with this in mind. Finally, calling a function on
 | 
						||
every attribute access results in a sizable performance loss.</p>
 | 
						||
<p><a class="reference internal" href="../library/functions.html#property" title="property"><code class="xref py py-class docutils literal notranslate"><span class="pre">property</span></code></a> is a new built-in type that packages up three functions that
 | 
						||
get, set, or delete an attribute, and a docstring.  For example, if you want to
 | 
						||
define a <code class="xref py py-attr docutils literal notranslate"><span class="pre">size</span></code> attribute that’s computed, but also settable, you could
 | 
						||
write:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">get_size</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						||
        <span class="n">result</span> <span class="o">=</span> <span class="o">...</span> <span class="n">computation</span> <span class="o">...</span>
 | 
						||
        <span class="k">return</span> <span class="n">result</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">set_size</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
 | 
						||
        <span class="o">...</span> <span class="n">compute</span> <span class="n">something</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">size</span>
 | 
						||
        <span class="ow">and</span> <span class="nb">set</span> <span class="n">internal</span> <span class="n">state</span> <span class="n">appropriately</span> <span class="o">...</span>
 | 
						||
 | 
						||
    <span class="c1"># Define a property.  The 'delete this attribute'</span>
 | 
						||
    <span class="c1"># method is defined as None, so the attribute</span>
 | 
						||
    <span class="c1"># can't be deleted.</span>
 | 
						||
    <span class="n">size</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_size</span><span class="p">,</span> <span class="n">set_size</span><span class="p">,</span>
 | 
						||
                    <span class="kc">None</span><span class="p">,</span>
 | 
						||
                    <span class="s2">"Storage size of this instance"</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>That is certainly clearer and easier to write than a pair of
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">__getattr__()</span></code>/<code class="xref py py-meth docutils literal notranslate"><span class="pre">__setattr__()</span></code> methods that check for the <code class="xref py py-attr docutils literal notranslate"><span class="pre">size</span></code>
 | 
						||
attribute and handle it specially while retrieving all other attributes from the
 | 
						||
instance’s <a class="reference internal" href="../reference/datamodel.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a>.  Accesses to <code class="xref py py-attr docutils literal notranslate"><span class="pre">size</span></code> are also the only ones
 | 
						||
which have to perform the work of calling a function, so references to other
 | 
						||
attributes run at their usual speed.</p>
 | 
						||
<p>Finally, it’s possible to constrain the list of attributes that can be
 | 
						||
referenced on an object using the new <a class="reference internal" href="../reference/datamodel.html#object.__slots__" title="object.__slots__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__slots__</span></code></a> class attribute. Python
 | 
						||
objects are usually very dynamic; at any time it’s possible to define a new
 | 
						||
attribute on an instance by just doing <code class="docutils literal notranslate"><span class="pre">obj.new_attr=1</span></code>.   A new-style class
 | 
						||
can define a class attribute named <a class="reference internal" href="../reference/datamodel.html#object.__slots__" title="object.__slots__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__slots__</span></code></a> to limit the legal
 | 
						||
attributes  to a particular set of names.  An example will make this clear:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
 | 
						||
<span class="gp">... </span>    <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'template'</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">)</span>
 | 
						||
<span class="gp">...</span>
 | 
						||
<span class="gp">>>> </span><span class="n">obj</span> <span class="o">=</span> <span class="n">C</span><span class="p">()</span>
 | 
						||
<span class="gp">>>> </span><span class="nb">print</span> <span class="n">obj</span><span class="o">.</span><span class="n">template</span>
 | 
						||
<span class="go">None</span>
 | 
						||
<span class="gp">>>> </span><span class="n">obj</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="s1">'Test'</span>
 | 
						||
<span class="gp">>>> </span><span class="nb">print</span> <span class="n">obj</span><span class="o">.</span><span class="n">template</span>
 | 
						||
<span class="go">Test</span>
 | 
						||
<span class="gp">>>> </span><span class="n">obj</span><span class="o">.</span><span class="n">newattr</span> <span class="o">=</span> <span class="kc">None</span>
 | 
						||
<span class="gt">Traceback (most recent call last):</span>
 | 
						||
  File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n">?</span>
 | 
						||
<span class="gr">AttributeError</span>: <span class="n">'C' object has no attribute 'newattr'</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Note how you get an <a class="reference internal" href="../library/exceptions.html#AttributeError" title="AttributeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">AttributeError</span></code></a> on the attempt to assign to an
 | 
						||
attribute not listed in <a class="reference internal" href="../reference/datamodel.html#object.__slots__" title="object.__slots__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__slots__</span></code></a>.</p>
 | 
						||
</section>
 | 
						||
<section id="related-links">
 | 
						||
<span id="sect-rellinks"></span><h3>Related Links<a class="headerlink" href="#related-links" title="Link to this heading">¶</a></h3>
 | 
						||
<p>This section has just been a quick overview of the new features, giving enough
 | 
						||
of an explanation to start you programming, but many details have been
 | 
						||
simplified or ignored.  Where should you go to get a more complete picture?</p>
 | 
						||
<p>The <a class="reference internal" href="../howto/descriptor.html#descriptorhowto"><span class="std std-ref">Descriptor Guide</span></a> is a lengthy tutorial introduction to
 | 
						||
the descriptor features, written by Guido van Rossum. If my description has
 | 
						||
whetted your appetite, go read this tutorial next, because it goes into much
 | 
						||
more detail about the new features while still remaining quite easy to read.</p>
 | 
						||
<p>Next, there are two relevant PEPs, <span class="target" id="index-2"></span><a class="pep reference external" href="https://peps.python.org/pep-0252/"><strong>PEP 252</strong></a> and <span class="target" id="index-3"></span><a class="pep reference external" href="https://peps.python.org/pep-0253/"><strong>PEP 253</strong></a>.  <span class="target" id="index-4"></span><a class="pep reference external" href="https://peps.python.org/pep-0252/"><strong>PEP 252</strong></a> is
 | 
						||
titled “Making Types Look More Like Classes”, and covers the descriptor API.
 | 
						||
<span class="target" id="index-5"></span><a class="pep reference external" href="https://peps.python.org/pep-0253/"><strong>PEP 253</strong></a> is titled “Subtyping Built-in Types”, and describes the changes to
 | 
						||
type objects that make it possible to subtype built-in objects.  <span class="target" id="index-6"></span><a class="pep reference external" href="https://peps.python.org/pep-0253/"><strong>PEP 253</strong></a> is
 | 
						||
the more complicated PEP of the two, and at a few points the necessary
 | 
						||
explanations of types and meta-types may cause your head to explode.  Both PEPs
 | 
						||
were written and implemented by Guido van Rossum, with substantial assistance
 | 
						||
from the rest of the Zope Corp. team.</p>
 | 
						||
<p>Finally, there’s the ultimate authority: the source code.  Most of the machinery
 | 
						||
for the type handling is in <code class="file docutils literal notranslate"><span class="pre">Objects/typeobject.c</span></code>, but you should only
 | 
						||
resort to it after all other avenues have been exhausted, including posting a
 | 
						||
question to python-list or python-dev.</p>
 | 
						||
</section>
 | 
						||
</section>
 | 
						||
<section id="pep-234-iterators">
 | 
						||
<h2>PEP 234: Iterators<a class="headerlink" href="#pep-234-iterators" title="Link to this heading">¶</a></h2>
 | 
						||
<p>Another significant addition to 2.2 is an iteration interface at both the C and
 | 
						||
Python levels.  Objects can define how they can be looped over by callers.</p>
 | 
						||
<p>In Python versions up to 2.1, the usual way to make <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">item</span> <span class="pre">in</span> <span class="pre">obj</span></code> work is
 | 
						||
to define a <a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getitem__()</span></code></a> method that looks something like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
 | 
						||
    <span class="k">return</span> <span class="o"><</span><span class="nb">next</span> <span class="n">item</span><span class="o">></span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p><a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getitem__()</span></code></a> is more properly used to define an indexing operation on an
 | 
						||
object so that you can write <code class="docutils literal notranslate"><span class="pre">obj[5]</span></code> to retrieve the sixth element.  It’s a
 | 
						||
bit misleading when you’re using this only to support <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> loops.
 | 
						||
Consider some file-like object that wants to be looped over; the <em>index</em>
 | 
						||
parameter is essentially meaningless, as the class probably assumes that a
 | 
						||
series of <a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getitem__()</span></code></a> calls will be made with <em>index</em> incrementing by
 | 
						||
one each time.  In other words, the presence of the <a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getitem__()</span></code></a> method
 | 
						||
doesn’t mean that using <code class="docutils literal notranslate"><span class="pre">file[5]</span></code>  to randomly access the sixth element will
 | 
						||
work, though it really should.</p>
 | 
						||
<p>In Python 2.2, iteration can be implemented separately, and <a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getitem__()</span></code></a>
 | 
						||
methods can be limited to classes that really do support random access.  The
 | 
						||
basic idea of iterators is  simple.  A new built-in function, <code class="docutils literal notranslate"><span class="pre">iter(obj)</span></code>
 | 
						||
or <code class="docutils literal notranslate"><span class="pre">iter(C,</span> <span class="pre">sentinel)</span></code>, is used to get an iterator. <code class="docutils literal notranslate"><span class="pre">iter(obj)</span></code> returns
 | 
						||
an iterator for the object <em>obj</em>, while <code class="docutils literal notranslate"><span class="pre">iter(C,</span> <span class="pre">sentinel)</span></code> returns an
 | 
						||
iterator that will invoke the callable object <em>C</em> until it returns <em>sentinel</em> to
 | 
						||
signal that the iterator is done.</p>
 | 
						||
<p>Python classes can define an <code class="xref py py-meth docutils literal notranslate"><span class="pre">__iter__()</span></code> method, which should create and
 | 
						||
return a new iterator for the object; if the object is its own iterator, this
 | 
						||
method can just return <code class="docutils literal notranslate"><span class="pre">self</span></code>.  In particular, iterators will usually be their
 | 
						||
own iterators.  Extension types implemented in C can implement a <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_iter" title="PyTypeObject.tp_iter"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_iter</span></code></a>
 | 
						||
function in order to return an iterator, and extension types that want to behave
 | 
						||
as iterators can define a <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_iternext" title="PyTypeObject.tp_iternext"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_iternext</span></code></a> function.</p>
 | 
						||
<p>So, after all this, what do iterators actually do?  They have one required
 | 
						||
method, <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a>, which takes no arguments and returns the next value.  When
 | 
						||
there are no more values to be returned, calling <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a> should raise the
 | 
						||
<a class="reference internal" href="../library/exceptions.html#StopIteration" title="StopIteration"><code class="xref py py-exc docutils literal notranslate"><span class="pre">StopIteration</span></code></a> exception.</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
 | 
						||
<span class="gp">>>> </span><span class="nb">print</span> <span class="n">i</span>
 | 
						||
<span class="go"><iterator object at 0x8116870></span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">1</span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">2</span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">3</span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="gt">Traceback (most recent call last):</span>
 | 
						||
  File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n">?</span>
 | 
						||
<span class="gr">StopIteration</span>
 | 
						||
<span class="gp">>>></span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>In 2.2, Python’s <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> statement no longer expects a sequence; it
 | 
						||
expects something for which <a class="reference internal" href="../library/functions.html#iter" title="iter"><code class="xref py py-func docutils literal notranslate"><span class="pre">iter()</span></code></a> will return an iterator. For backward
 | 
						||
compatibility and convenience, an iterator is automatically constructed for
 | 
						||
sequences that don’t implement <code class="xref py py-meth docutils literal notranslate"><span class="pre">__iter__()</span></code> or a <a class="reference internal" href="../c-api/typeobj.html#c.PyTypeObject.tp_iter" title="PyTypeObject.tp_iter"><code class="xref c c-member docutils literal notranslate"><span class="pre">tp_iter</span></code></a> slot, so
 | 
						||
<code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">i</span> <span class="pre">in</span> <span class="pre">[1,2,3]</span></code> will still work.  Wherever the Python interpreter loops
 | 
						||
over a sequence, it’s been changed to use the iterator protocol.  This means you
 | 
						||
can do things like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
 | 
						||
<span class="gp">>>> </span><span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
 | 
						||
<span class="gp">>>> </span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span> <span class="o">=</span> <span class="n">i</span>
 | 
						||
<span class="gp">>>> </span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span>
 | 
						||
<span class="go">(1, 2, 3)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Iterator support has been added to some of Python’s basic types.   Calling
 | 
						||
<a class="reference internal" href="../library/functions.html#iter" title="iter"><code class="xref py py-func docutils literal notranslate"><span class="pre">iter()</span></code></a> on a dictionary will return an iterator which loops over its keys:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">m</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Jan'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Feb'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'Mar'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'Apr'</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">'May'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">'Jun'</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
 | 
						||
<span class="gp">... </span>     <span class="s1">'Jul'</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span> <span class="s1">'Aug'</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span> <span class="s1">'Sep'</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span> <span class="s1">'Oct'</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="s1">'Nov'</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span> <span class="s1">'Dec'</span><span class="p">:</span> <span class="mi">12</span><span class="p">}</span>
 | 
						||
<span class="gp">>>> </span><span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">m</span><span class="p">:</span> <span class="nb">print</span> <span class="n">key</span><span class="p">,</span> <span class="n">m</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
 | 
						||
<span class="gp">...</span>
 | 
						||
<span class="go">Mar 3</span>
 | 
						||
<span class="go">Feb 2</span>
 | 
						||
<span class="go">Aug 8</span>
 | 
						||
<span class="go">Sep 9</span>
 | 
						||
<span class="go">May 5</span>
 | 
						||
<span class="go">Jun 6</span>
 | 
						||
<span class="go">Jul 7</span>
 | 
						||
<span class="go">Jan 1</span>
 | 
						||
<span class="go">Apr 4</span>
 | 
						||
<span class="go">Nov 11</span>
 | 
						||
<span class="go">Dec 12</span>
 | 
						||
<span class="go">Oct 10</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>That’s just the default behaviour.  If you want to iterate over keys, values, or
 | 
						||
key/value pairs, you can explicitly call the <code class="xref py py-meth docutils literal notranslate"><span class="pre">iterkeys()</span></code>,
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">itervalues()</span></code>, or <code class="xref py py-meth docutils literal notranslate"><span class="pre">iteritems()</span></code> methods to get an appropriate iterator.
 | 
						||
In a minor related change, the <a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">in</span></code></a> operator now works on dictionaries,
 | 
						||
so <code class="docutils literal notranslate"><span class="pre">key</span> <span class="pre">in</span> <span class="pre">dict</span></code> is now equivalent to <code class="docutils literal notranslate"><span class="pre">dict.has_key(key)</span></code>.</p>
 | 
						||
<p>Files also provide an iterator, which calls the <a class="reference internal" href="../library/readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><code class="xref py py-meth docutils literal notranslate"><span class="pre">readline()</span></code></a> method until
 | 
						||
there are no more lines in the file.  This means you can now read each line of a
 | 
						||
file using code like this:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">file</span><span class="p">:</span>
 | 
						||
    <span class="c1"># do something for each line</span>
 | 
						||
    <span class="o">...</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Note that you can only go forward in an iterator; there’s no way to get the
 | 
						||
previous element, reset the iterator, or make a copy of it. An iterator object
 | 
						||
could provide such additional capabilities, but the iterator protocol only
 | 
						||
requires a <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a> method.</p>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0234/"><strong>PEP 234</strong></a> - Iterators</dt><dd><p>Written by Ka-Ping Yee and GvR; implemented  by the Python Labs crew, mostly by
 | 
						||
GvR and Tim Peters.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="pep-255-simple-generators">
 | 
						||
<h2>PEP 255: Simple Generators<a class="headerlink" href="#pep-255-simple-generators" title="Link to this heading">¶</a></h2>
 | 
						||
<p>Generators are another new feature, one that interacts with the introduction of
 | 
						||
iterators.</p>
 | 
						||
<p>You’re doubtless familiar with how function calls work in Python or C.  When you
 | 
						||
call a function, it gets a private namespace where its local variables are
 | 
						||
created.  When the function reaches a <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> statement, the local
 | 
						||
variables are destroyed and the resulting value is returned to the caller.  A
 | 
						||
later call to the same function will get a fresh new set of local variables.
 | 
						||
But, what if the local variables weren’t thrown away on exiting a function?
 | 
						||
What if you could later resume the function where it left off?  This is what
 | 
						||
generators provide; they can be thought of as resumable functions.</p>
 | 
						||
<p>Here’s the simplest example of a generator function:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">generate_ints</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
 | 
						||
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
 | 
						||
        <span class="k">yield</span> <span class="n">i</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>A new keyword, <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a>, was introduced for generators.  Any function
 | 
						||
containing a <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> statement is a generator function; this is
 | 
						||
detected by Python’s bytecode compiler which compiles the function specially as
 | 
						||
a result.  Because a new keyword was introduced, generators must be explicitly
 | 
						||
enabled in a module by including a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">__future__</span> <span class="pre">import</span> <span class="pre">generators</span></code>
 | 
						||
statement near the top of the module’s source code.  In Python 2.3 this
 | 
						||
statement will become unnecessary.</p>
 | 
						||
<p>When you call a generator function, it doesn’t return a single value; instead it
 | 
						||
returns a generator object that supports the iterator protocol.  On executing
 | 
						||
the <a class="reference internal" href="../reference/simple_stmts.html#yield"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code></a> statement, the generator outputs the value of <code class="docutils literal notranslate"><span class="pre">i</span></code>,
 | 
						||
similar to a <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> statement.  The big difference between
 | 
						||
<code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> and a <code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code> statement is that on reaching a
 | 
						||
<code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> the generator’s state of execution is suspended and local
 | 
						||
variables are preserved.  On the next call to the generator’s <code class="docutils literal notranslate"><span class="pre">next()</span></code> method,
 | 
						||
the function will resume executing immediately after the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code>
 | 
						||
statement.  (For complicated reasons, the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> statement isn’t
 | 
						||
allowed inside the <code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code> block of a
 | 
						||
<a class="reference internal" href="../reference/compound_stmts.html#try"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code></a>…<a class="reference internal" href="../reference/compound_stmts.html#finally"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">finally</span></code></a> statement; read <span class="target" id="index-8"></span><a class="pep reference external" href="https://peps.python.org/pep-0255/"><strong>PEP 255</strong></a> for a full
 | 
						||
explanation of the interaction between <code class="xref std std-keyword docutils literal notranslate"><span class="pre">yield</span></code> and exceptions.)</p>
 | 
						||
<p>Here’s a sample usage of the <code class="xref py py-func docutils literal notranslate"><span class="pre">generate_ints()</span></code> generator:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">gen</span> <span class="o">=</span> <span class="n">generate_ints</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
 | 
						||
<span class="gp">>>> </span><span class="n">gen</span>
 | 
						||
<span class="go"><generator object at 0x8117f90></span>
 | 
						||
<span class="gp">>>> </span><span class="n">gen</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">0</span>
 | 
						||
<span class="gp">>>> </span><span class="n">gen</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">1</span>
 | 
						||
<span class="gp">>>> </span><span class="n">gen</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="go">2</span>
 | 
						||
<span class="gp">>>> </span><span class="n">gen</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
 | 
						||
<span class="gt">Traceback (most recent call last):</span>
 | 
						||
  File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n">?</span>
 | 
						||
  File <span class="nb">"<stdin>"</span>, line <span class="m">2</span>, in <span class="n">generate_ints</span>
 | 
						||
<span class="gr">StopIteration</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>You could equally write <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">i</span> <span class="pre">in</span> <span class="pre">generate_ints(5)</span></code>, or <code class="docutils literal notranslate"><span class="pre">a,b,c</span> <span class="pre">=</span>
 | 
						||
<span class="pre">generate_ints(3)</span></code>.</p>
 | 
						||
<p>Inside a generator function, the <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> statement can only be used
 | 
						||
without a value, and signals the end of the procession of values; afterwards the
 | 
						||
generator cannot return any further values. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code> with a value, such
 | 
						||
as <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">5</span></code>, is a syntax error inside a generator function.  The end of the
 | 
						||
generator’s results can also be indicated by raising <a class="reference internal" href="../library/exceptions.html#StopIteration" title="StopIteration"><code class="xref py py-exc docutils literal notranslate"><span class="pre">StopIteration</span></code></a>
 | 
						||
manually, or by just letting the flow of execution fall off the bottom of the
 | 
						||
function.</p>
 | 
						||
<p>You could achieve the effect of generators manually by writing your own class
 | 
						||
and storing all the local variables of the generator as instance variables.  For
 | 
						||
example, returning a list of integers could be done by setting <code class="docutils literal notranslate"><span class="pre">self.count</span></code> to
 | 
						||
0, and having the <a class="reference internal" href="../library/functions.html#next" title="next"><code class="xref py py-meth docutils literal notranslate"><span class="pre">next()</span></code></a> method increment <code class="docutils literal notranslate"><span class="pre">self.count</span></code> and return it.
 | 
						||
However, for a moderately complicated generator, writing a corresponding class
 | 
						||
would be much messier. <code class="file docutils literal notranslate"><span class="pre">Lib/test/test_generators.py</span></code> contains a number of
 | 
						||
more interesting examples.  The simplest one implements an in-order traversal of
 | 
						||
a tree using generators recursively.</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># A recursive generator that generates Tree leaves in in-order.</span>
 | 
						||
<span class="k">def</span><span class="w"> </span><span class="nf">inorder</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
 | 
						||
    <span class="k">if</span> <span class="n">t</span><span class="p">:</span>
 | 
						||
        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">inorder</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">left</span><span class="p">):</span>
 | 
						||
            <span class="k">yield</span> <span class="n">x</span>
 | 
						||
        <span class="k">yield</span> <span class="n">t</span><span class="o">.</span><span class="n">label</span>
 | 
						||
        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">inorder</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">right</span><span class="p">):</span>
 | 
						||
            <span class="k">yield</span> <span class="n">x</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Two other examples in <code class="file docutils literal notranslate"><span class="pre">Lib/test/test_generators.py</span></code> produce solutions for
 | 
						||
the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
 | 
						||
queen threatens another) and the Knight’s Tour (a route that takes a knight to
 | 
						||
every square of an $NxN$ chessboard without visiting any square twice).</p>
 | 
						||
<p>The idea of generators comes from other programming languages, especially Icon
 | 
						||
(<a class="reference external" href="https://www2.cs.arizona.edu/icon/">https://www2.cs.arizona.edu/icon/</a>), where the idea of generators is central.  In
 | 
						||
Icon, every expression and function call behaves like a generator.  One example
 | 
						||
from “An Overview of the Icon Programming Language” at
 | 
						||
<a class="reference external" href="https://www2.cs.arizona.edu/icon/docs/ipd266.htm">https://www2.cs.arizona.edu/icon/docs/ipd266.htm</a> gives an idea of what this looks
 | 
						||
like:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">sentence</span> <span class="o">:=</span> <span class="s2">"Store it in the neighboring harbor"</span>
 | 
						||
<span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">:=</span> <span class="n">find</span><span class="p">(</span><span class="s2">"or"</span><span class="p">,</span> <span class="n">sentence</span><span class="p">))</span> <span class="o">></span> <span class="mi">5</span> <span class="n">then</span> <span class="n">write</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>In Icon the <code class="xref py py-func docutils literal notranslate"><span class="pre">find()</span></code> function returns the indexes at which the substring
 | 
						||
“or” is found: 3, 23, 33.  In the <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> statement, <code class="docutils literal notranslate"><span class="pre">i</span></code> is first
 | 
						||
assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
 | 
						||
retries it with the second value of 23.  23 is greater than 5, so the comparison
 | 
						||
now succeeds, and the code prints the value 23 to the screen.</p>
 | 
						||
<p>Python doesn’t go nearly as far as Icon in adopting generators as a central
 | 
						||
concept.  Generators are considered a new part of the core Python language, but
 | 
						||
learning or using them isn’t compulsory; if they don’t solve any problems that
 | 
						||
you have, feel free to ignore them. One novel feature of Python’s interface as
 | 
						||
compared to Icon’s is that a generator’s state is represented as a concrete
 | 
						||
object (the iterator) that can be passed around to other functions or stored in
 | 
						||
a data structure.</p>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0255/"><strong>PEP 255</strong></a> - Simple Generators</dt><dd><p>Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
 | 
						||
by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="pep-237-unifying-long-integers-and-integers">
 | 
						||
<h2>PEP 237: Unifying Long Integers and Integers<a class="headerlink" href="#pep-237-unifying-long-integers-and-integers" title="Link to this heading">¶</a></h2>
 | 
						||
<p>In recent versions, the distinction between regular integers, which are 32-bit
 | 
						||
values on most machines, and long integers, which can be of arbitrary size, was
 | 
						||
becoming an annoyance.  For example, on platforms that support files larger than
 | 
						||
<code class="docutils literal notranslate"><span class="pre">2**32</span></code> bytes, the <code class="xref py py-meth docutils literal notranslate"><span class="pre">tell()</span></code> method of file objects has to return a long
 | 
						||
integer. However, there were various bits of Python that expected plain integers
 | 
						||
and would raise an error if a long integer was provided instead.  For example,
 | 
						||
in Python 1.5, only regular integers could be used as a slice index, and
 | 
						||
<code class="docutils literal notranslate"><span class="pre">'abc'[1L:]</span></code> would raise a <a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> exception with the message ‘slice
 | 
						||
index must be int’.</p>
 | 
						||
<p>Python 2.2 will shift values from short to long integers as required. The ‘L’
 | 
						||
suffix is no longer needed to indicate a long integer literal, as now the
 | 
						||
compiler will choose the appropriate type.  (Using the ‘L’ suffix will be
 | 
						||
discouraged in future 2.x versions of Python, triggering a warning in Python
 | 
						||
2.4, and probably dropped in Python 3.0.)  Many operations that used to raise an
 | 
						||
<a class="reference internal" href="../library/exceptions.html#OverflowError" title="OverflowError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OverflowError</span></code></a> will now return a long integer as their result.  For
 | 
						||
example:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mi">1234567890123</span>
 | 
						||
<span class="go">1234567890123L</span>
 | 
						||
<span class="gp">>>> </span><span class="mi">2</span> <span class="o">**</span> <span class="mi">64</span>
 | 
						||
<span class="go">18446744073709551616L</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>In most cases, integers and long integers will now be treated identically.  You
 | 
						||
can still distinguish them with the <a class="reference internal" href="../library/functions.html#type" title="type"><code class="xref py py-func docutils literal notranslate"><span class="pre">type()</span></code></a> built-in function, but that’s
 | 
						||
rarely needed.</p>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-10"></span><a class="pep reference external" href="https://peps.python.org/pep-0237/"><strong>PEP 237</strong></a> - Unifying Long Integers and Integers</dt><dd><p>Written by Moshe Zadka and Guido van Rossum.  Implemented mostly by Guido van
 | 
						||
Rossum.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="pep-238-changing-the-division-operator">
 | 
						||
<h2>PEP 238: Changing the Division Operator<a class="headerlink" href="#pep-238-changing-the-division-operator" title="Link to this heading">¶</a></h2>
 | 
						||
<p>The most controversial change in Python 2.2 heralds the start of an effort to
 | 
						||
fix an old design flaw that’s been in Python from the beginning. Currently
 | 
						||
Python’s division operator, <code class="docutils literal notranslate"><span class="pre">/</span></code>, behaves like C’s division operator when
 | 
						||
presented with two integer arguments: it returns an integer result that’s
 | 
						||
truncated down when there would be a fractional part.  For example, <code class="docutils literal notranslate"><span class="pre">3/2</span></code> is
 | 
						||
1, not 1.5, and <code class="docutils literal notranslate"><span class="pre">(-1)/2</span></code> is -1, not -0.5.  This means that the results of
 | 
						||
division can vary unexpectedly depending on the type of the two operands and
 | 
						||
because Python is dynamically typed, it can be difficult to determine the
 | 
						||
possible types of the operands.</p>
 | 
						||
<p>(The controversy is over whether this is <em>really</em> a design flaw, and whether
 | 
						||
it’s worth breaking existing code to fix this.  It’s caused endless discussions
 | 
						||
on python-dev, and in July 2001 erupted into a storm of acidly sarcastic
 | 
						||
postings on <em class="newsgroup">comp.lang.python</em>. I won’t argue for either side here
 | 
						||
and will stick to describing what’s  implemented in 2.2.  Read <span class="target" id="index-11"></span><a class="pep reference external" href="https://peps.python.org/pep-0238/"><strong>PEP 238</strong></a> for a
 | 
						||
summary of arguments and counter-arguments.)</p>
 | 
						||
<p>Because this change might break code, it’s being introduced very gradually.
 | 
						||
Python 2.2 begins the transition, but the switch won’t be complete until Python
 | 
						||
3.0.</p>
 | 
						||
<p>First, I’ll borrow some terminology from <span class="target" id="index-12"></span><a class="pep reference external" href="https://peps.python.org/pep-0238/"><strong>PEP 238</strong></a>.  “True division” is the
 | 
						||
division that most non-programmers are familiar with: 3/2 is 1.5, 1/4 is 0.25,
 | 
						||
and so forth.  “Floor division” is what Python’s <code class="docutils literal notranslate"><span class="pre">/</span></code> operator currently does
 | 
						||
when given integer operands; the result is the floor of the value returned by
 | 
						||
true division.  “Classic division” is the current mixed behaviour of <code class="docutils literal notranslate"><span class="pre">/</span></code>; it
 | 
						||
returns the result of floor division when the operands are integers, and returns
 | 
						||
the result of true division when one of the operands is a floating-point number.</p>
 | 
						||
<p>Here are the changes 2.2 introduces:</p>
 | 
						||
<ul>
 | 
						||
<li><p>A new operator, <code class="docutils literal notranslate"><span class="pre">//</span></code>, is the floor division operator. (Yes, we know it looks
 | 
						||
like C++’s comment symbol.)  <code class="docutils literal notranslate"><span class="pre">//</span></code> <em>always</em> performs floor division no matter
 | 
						||
what the types of its operands are, so <code class="docutils literal notranslate"><span class="pre">1</span> <span class="pre">//</span> <span class="pre">2</span></code> is 0 and <code class="docutils literal notranslate"><span class="pre">1.0</span> <span class="pre">//</span> <span class="pre">2.0</span></code> is
 | 
						||
also 0.0.</p>
 | 
						||
<p><code class="docutils literal notranslate"><span class="pre">//</span></code> is always available in Python 2.2; you don’t need to enable it using a
 | 
						||
<code class="docutils literal notranslate"><span class="pre">__future__</span></code> statement.</p>
 | 
						||
</li>
 | 
						||
<li><p>By including a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">__future__</span> <span class="pre">import</span> <span class="pre">division</span></code> in a module, the <code class="docutils literal notranslate"><span class="pre">/</span></code>
 | 
						||
operator will be changed to return the result of true division, so <code class="docutils literal notranslate"><span class="pre">1/2</span></code> is
 | 
						||
0.5.  Without the <code class="docutils literal notranslate"><span class="pre">__future__</span></code> statement, <code class="docutils literal notranslate"><span class="pre">/</span></code> still means classic division.
 | 
						||
The default meaning of <code class="docutils literal notranslate"><span class="pre">/</span></code> will not change until Python 3.0.</p></li>
 | 
						||
<li><p>Classes can define methods called <a class="reference internal" href="../reference/datamodel.html#object.__truediv__" title="object.__truediv__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__truediv__()</span></code></a> and <a class="reference internal" href="../reference/datamodel.html#object.__floordiv__" title="object.__floordiv__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__floordiv__()</span></code></a>
 | 
						||
to overload the two division operators.  At the C level, there are also slots in
 | 
						||
the <a class="reference internal" href="../c-api/typeobj.html#c.PyNumberMethods" title="PyNumberMethods"><code class="xref c c-type docutils literal notranslate"><span class="pre">PyNumberMethods</span></code></a> structure so extension types can define the two
 | 
						||
operators.</p></li>
 | 
						||
<li><p>Python 2.2 supports some command-line arguments for testing whether code will
 | 
						||
work with the changed division semantics.  Running python with <code class="xref std std-option docutils literal notranslate"><span class="pre">-Q</span>
 | 
						||
<span class="pre">warn</span></code> will cause a warning to be issued whenever division is applied to two
 | 
						||
integers.  You can use this to find code that’s affected by the change and fix
 | 
						||
it.  By default, Python 2.2 will simply perform classic division without a
 | 
						||
warning; the warning will be turned on by default in Python 2.3.</p></li>
 | 
						||
</ul>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-13"></span><a class="pep reference external" href="https://peps.python.org/pep-0238/"><strong>PEP 238</strong></a> - Changing the Division Operator</dt><dd><p>Written by Moshe Zadka and  Guido van Rossum.  Implemented by Guido van Rossum..</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="unicode-changes">
 | 
						||
<h2>Unicode Changes<a class="headerlink" href="#unicode-changes" title="Link to this heading">¶</a></h2>
 | 
						||
<p>Python’s Unicode support has been enhanced a bit in 2.2.  Unicode strings are
 | 
						||
usually stored as UCS-2, as 16-bit unsigned integers. Python 2.2 can also be
 | 
						||
compiled to use UCS-4, 32-bit unsigned integers, as its internal encoding by
 | 
						||
supplying <code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-unicode=ucs4</span></code> to the configure script.   (It’s also
 | 
						||
possible to specify <code class="xref std std-option docutils literal notranslate"><span class="pre">--disable-unicode</span></code> to completely disable Unicode
 | 
						||
support.)</p>
 | 
						||
<p>When built to use UCS-4 (a “wide Python”), the interpreter can natively handle
 | 
						||
Unicode characters from U+000000 to U+110000, so the range of legal values for
 | 
						||
the <code class="xref py py-func docutils literal notranslate"><span class="pre">unichr()</span></code> function is expanded accordingly.  Using an interpreter
 | 
						||
compiled to use UCS-2 (a “narrow Python”), values greater than 65535 will still
 | 
						||
cause <code class="xref py py-func docutils literal notranslate"><span class="pre">unichr()</span></code> to raise a <a class="reference internal" href="../library/exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> exception. This is all
 | 
						||
described in <span class="target" id="index-14"></span><a class="pep reference external" href="https://peps.python.org/pep-0261/"><strong>PEP 261</strong></a>, “Support for ‘wide’ Unicode characters”; consult it for
 | 
						||
further details.</p>
 | 
						||
<p>Another change is simpler to explain. Since their introduction, Unicode strings
 | 
						||
have supported an <code class="xref py py-meth docutils literal notranslate"><span class="pre">encode()</span></code> method to convert the string to a selected
 | 
						||
encoding such as UTF-8 or Latin-1.  A symmetric <code class="docutils literal notranslate"><span class="pre">decode([*encoding*])</span></code>
 | 
						||
method has been added to 8-bit strings (though not to Unicode strings) in 2.2.
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">decode()</span></code> assumes that the string is in the specified encoding and decodes
 | 
						||
it, returning whatever is returned by the codec.</p>
 | 
						||
<p>Using this new feature, codecs have been added for tasks not directly related to
 | 
						||
Unicode.  For example, codecs have been added for uu-encoding, MIME’s base64
 | 
						||
encoding, and compression with the <a class="reference internal" href="../library/zlib.html#module-zlib" title="zlib: Low-level interface to compression and decompression routines compatible with gzip."><code class="xref py py-mod docutils literal notranslate"><span class="pre">zlib</span></code></a> module:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="s2">"""Here is a lengthy piece of redundant, overly verbose,</span>
 | 
						||
<span class="gp">... </span><span class="s2">and repetitive text.</span>
 | 
						||
<span class="gp">... </span><span class="s2">"""</span>
 | 
						||
<span class="gp">>>> </span><span class="n">data</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'zlib'</span><span class="p">)</span>
 | 
						||
<span class="gp">>>> </span><span class="n">data</span>
 | 
						||
<span class="go">'x\x9c\r\xc9\xc1\r\x80 \x10\x04\xc0?Ul...'</span>
 | 
						||
<span class="gp">>>> </span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'zlib'</span><span class="p">)</span>
 | 
						||
<span class="go">'Here is a lengthy piece of redundant, overly verbose,\nand repetitive text.\n'</span>
 | 
						||
<span class="gp">>>> </span><span class="nb">print</span> <span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'uu'</span><span class="p">)</span>
 | 
						||
<span class="go">begin 666 <data></span>
 | 
						||
<span class="go">M2&5R92!I<R!A(&QE;F=T:'D@<&EE8V4@;V8@<F5D=6YD86YT+"!O=F5R;'D@</span>
 | 
						||
<span class="go">>=F5R8F]S92P*86YD(')E<&5T:71I=F4@=&5X="X*</span>
 | 
						||
 | 
						||
<span class="go">end</span>
 | 
						||
<span class="gp">>>> </span><span class="s2">"sheesh"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'rot-13'</span><span class="p">)</span>
 | 
						||
<span class="go">'furrfu'</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>To convert a class instance to Unicode, a <code class="xref py py-meth docutils literal notranslate"><span class="pre">__unicode__()</span></code> method can be
 | 
						||
defined by a class, analogous to <code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code>.</p>
 | 
						||
<p><code class="xref py py-meth docutils literal notranslate"><span class="pre">encode()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">decode()</span></code>, and <code class="xref py py-meth docutils literal notranslate"><span class="pre">__unicode__()</span></code> were implemented by
 | 
						||
Marc-André Lemburg.  The changes to support using UCS-4 internally were
 | 
						||
implemented by Fredrik Lundh and Martin von Löwis.</p>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-15"></span><a class="pep reference external" href="https://peps.python.org/pep-0261/"><strong>PEP 261</strong></a> - Support for ‘wide’ Unicode characters</dt><dd><p>Written by Paul Prescod.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="pep-227-nested-scopes">
 | 
						||
<h2>PEP 227: Nested Scopes<a class="headerlink" href="#pep-227-nested-scopes" title="Link to this heading">¶</a></h2>
 | 
						||
<p>In Python 2.1, statically nested scopes were added as an optional feature, to be
 | 
						||
enabled by a <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">__future__</span> <span class="pre">import</span> <span class="pre">nested_scopes</span></code> directive.  In 2.2 nested
 | 
						||
scopes no longer need to be specially enabled, and are now always present.  The
 | 
						||
rest of this section is a copy of the description of nested scopes from my
 | 
						||
“What’s New in Python 2.1” document; if you read it when 2.1 came out, you can
 | 
						||
skip the rest of this section.</p>
 | 
						||
<p>The largest change introduced in Python 2.1, and made complete in 2.2, is to
 | 
						||
Python’s scoping rules.  In Python 2.0, at any given time there are at most
 | 
						||
three namespaces used to look up variable names: local, module-level, and the
 | 
						||
built-in namespace.  This often surprised people because it didn’t match their
 | 
						||
intuitive expectations.  For example, a nested recursive function definition
 | 
						||
doesn’t work:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">():</span>
 | 
						||
    <span class="o">...</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">g</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
 | 
						||
        <span class="o">...</span>
 | 
						||
        <span class="k">return</span> <span class="n">g</span><span class="p">(</span><span class="n">value</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
 | 
						||
    <span class="o">...</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The function <code class="xref py py-func docutils literal notranslate"><span class="pre">g()</span></code> will always raise a <a class="reference internal" href="../library/exceptions.html#NameError" title="NameError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NameError</span></code></a> exception, because
 | 
						||
the binding of the name <code class="docutils literal notranslate"><span class="pre">g</span></code> isn’t in either its local namespace or in the
 | 
						||
module-level namespace.  This isn’t much of a problem in practice (how often do
 | 
						||
you recursively define interior functions like this?), but this also made using
 | 
						||
the <a class="reference internal" href="../reference/expressions.html#lambda"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code></a> expression clumsier, and this was a problem in practice.
 | 
						||
In code which uses <code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code> you can often find local variables being
 | 
						||
copied by passing them as the default values of arguments.</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
 | 
						||
    <span class="s2">"Return list of any entries equal to 'name'"</span>
 | 
						||
    <span class="n">L</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">:</span> <span class="n">x</span> <span class="o">==</span> <span class="n">name</span><span class="p">,</span>
 | 
						||
               <span class="bp">self</span><span class="o">.</span><span class="n">list_attribute</span><span class="p">)</span>
 | 
						||
    <span class="k">return</span> <span class="n">L</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The readability of Python code written in a strongly functional style suffers
 | 
						||
greatly as a result.</p>
 | 
						||
<p>The most significant change to Python 2.2 is that static scoping has been added
 | 
						||
to the language to fix this problem.  As a first effect, the <code class="docutils literal notranslate"><span class="pre">name=name</span></code>
 | 
						||
default argument is now unnecessary in the above example.  Put simply, when a
 | 
						||
given variable name is not assigned a value within a function (by an assignment,
 | 
						||
or the <a class="reference internal" href="../reference/compound_stmts.html#def"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">def</span></code></a>, <a class="reference internal" href="../reference/compound_stmts.html#class"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">class</span></code></a>, or <a class="reference internal" href="../reference/simple_stmts.html#import"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">import</span></code></a> statements),
 | 
						||
references to the variable will be looked up in the local namespace of the
 | 
						||
enclosing scope.  A more detailed explanation of the rules, and a dissection of
 | 
						||
the implementation, can be found in the PEP.</p>
 | 
						||
<p>This change may cause some compatibility problems for code where the same
 | 
						||
variable name is used both at the module level and as a local variable within a
 | 
						||
function that contains further function definitions. This seems rather unlikely
 | 
						||
though, since such code would have been pretty confusing to read in the first
 | 
						||
place.</p>
 | 
						||
<p>One side effect of the change is that the <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">module</span> <span class="pre">import</span> <span class="pre">*</span></code> and
 | 
						||
<code class="docutils literal notranslate"><span class="pre">exec</span></code> statements have been made illegal inside a function scope under
 | 
						||
certain conditions.  The Python reference manual has said all along that <code class="docutils literal notranslate"><span class="pre">from</span>
 | 
						||
<span class="pre">module</span> <span class="pre">import</span> <span class="pre">*</span></code> is only legal at the top level of a module, but the CPython
 | 
						||
interpreter has never enforced this before.  As part of the implementation of
 | 
						||
nested scopes, the compiler which turns Python source into bytecodes has to
 | 
						||
generate different code to access variables in a containing scope.  <code class="docutils literal notranslate"><span class="pre">from</span>
 | 
						||
<span class="pre">module</span> <span class="pre">import</span> <span class="pre">*</span></code> and <code class="docutils literal notranslate"><span class="pre">exec</span></code> make it impossible for the compiler to
 | 
						||
figure this out, because they add names to the local namespace that are
 | 
						||
unknowable at compile time. Therefore, if a function contains function
 | 
						||
definitions or <a class="reference internal" href="../reference/expressions.html#lambda"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code></a> expressions with free variables, the compiler
 | 
						||
will flag this by raising a <a class="reference internal" href="../library/exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> exception.</p>
 | 
						||
<p>To make the preceding explanation a bit clearer, here’s an example:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
 | 
						||
<span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">():</span>
 | 
						||
    <span class="c1"># The next line is a syntax error</span>
 | 
						||
    <span class="n">exec</span> <span class="s1">'x=2'</span>
 | 
						||
    <span class="k">def</span><span class="w"> </span><span class="nf">g</span><span class="p">():</span>
 | 
						||
        <span class="k">return</span> <span class="n">x</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>Line 4 containing the <code class="docutils literal notranslate"><span class="pre">exec</span></code> statement is a syntax error, since
 | 
						||
<code class="docutils literal notranslate"><span class="pre">exec</span></code> would define a new local variable named <code class="docutils literal notranslate"><span class="pre">x</span></code> whose value should
 | 
						||
be accessed by <code class="xref py py-func docutils literal notranslate"><span class="pre">g()</span></code>.</p>
 | 
						||
<p>This shouldn’t be much of a limitation, since <code class="docutils literal notranslate"><span class="pre">exec</span></code> is rarely used in
 | 
						||
most Python code (and when it is used, it’s often a sign of a poor design
 | 
						||
anyway).</p>
 | 
						||
<div class="admonition seealso">
 | 
						||
<p class="admonition-title">See also</p>
 | 
						||
<dl class="simple">
 | 
						||
<dt><span class="target" id="index-16"></span><a class="pep reference external" href="https://peps.python.org/pep-0227/"><strong>PEP 227</strong></a> - Statically Nested Scopes</dt><dd><p>Written and implemented by Jeremy Hylton.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</div>
 | 
						||
</section>
 | 
						||
<section id="new-and-improved-modules">
 | 
						||
<h2>New and Improved Modules<a class="headerlink" href="#new-and-improved-modules" title="Link to this heading">¶</a></h2>
 | 
						||
<ul>
 | 
						||
<li><p>The <a class="reference internal" href="../library/xmlrpc.client.html#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpclib</span></code></a> module was contributed to the standard library by Fredrik
 | 
						||
Lundh, providing support for writing XML-RPC clients.  XML-RPC is a simple
 | 
						||
remote procedure call protocol built on top of HTTP and XML. For example, the
 | 
						||
following snippet retrieves a list of RSS channels from the O’Reilly Network,
 | 
						||
and then  lists the recent headlines for one channel:</p>
 | 
						||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">xmlrpclib</span>
 | 
						||
<span class="n">s</span> <span class="o">=</span> <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">Server</span><span class="p">(</span>
 | 
						||
      <span class="s1">'http://www.oreillynet.com/meerkat/xml-rpc/server.php'</span><span class="p">)</span>
 | 
						||
<span class="n">channels</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">meerkat</span><span class="o">.</span><span class="n">getChannels</span><span class="p">()</span>
 | 
						||
<span class="c1"># channels is a list of dictionaries, like this:</span>
 | 
						||
<span class="c1"># [{'id': 4, 'title': 'Freshmeat Daily News'}</span>
 | 
						||
<span class="c1">#  {'id': 190, 'title': '32Bits Online'},</span>
 | 
						||
<span class="c1">#  {'id': 4549, 'title': '3DGamers'}, ... ]</span>
 | 
						||
 | 
						||
<span class="c1"># Get the items for one channel</span>
 | 
						||
<span class="n">items</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">meerkat</span><span class="o">.</span><span class="n">getItems</span><span class="p">(</span> <span class="p">{</span><span class="s1">'channel'</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span> <span class="p">)</span>
 | 
						||
 | 
						||
<span class="c1"># 'items' is another list of dictionaries, like this:</span>
 | 
						||
<span class="c1"># [{'link': 'http://freshmeat.net/releases/52719/',</span>
 | 
						||
<span class="c1">#   'description': 'A utility which converts HTML to XSL FO.',</span>
 | 
						||
<span class="c1">#   'title': 'html2fo 0.3 (Default)'}, ... ]</span>
 | 
						||
</pre></div>
 | 
						||
</div>
 | 
						||
<p>The <a class="reference internal" href="../library/xmlrpc.server.html#module-xmlrpc.server" title="xmlrpc.server: Basic XML-RPC server implementations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">SimpleXMLRPCServer</span></code></a> module makes it easy to create straightforward
 | 
						||
XML-RPC servers.  See <a class="reference external" href="http://xmlrpc.scripting.com/">http://xmlrpc.scripting.com/</a> for more information about XML-RPC.</p>
 | 
						||
</li>
 | 
						||
<li><p>The new <a class="reference internal" href="../library/hmac.html#module-hmac" title="hmac: Keyed-Hashing for Message Authentication (HMAC) implementation"><code class="xref py py-mod docutils literal notranslate"><span class="pre">hmac</span></code></a> module implements the HMAC algorithm described by
 | 
						||
<span class="target" id="index-17"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2104.html"><strong>RFC 2104</strong></a>. (Contributed by Gerhard Häring.)</p></li>
 | 
						||
<li><p>Several functions that originally returned lengthy tuples now return
 | 
						||
pseudo-sequences that still behave like tuples but also have mnemonic attributes such
 | 
						||
as <code class="xref py py-attr docutils literal notranslate"><span class="pre">memberst_mtime</span></code> or <a class="reference internal" href="../library/time.html#time.struct_time.tm_year" title="time.struct_time.tm_year"><code class="xref py py-attr docutils literal notranslate"><span class="pre">tm_year</span></code></a>. The enhanced functions include
 | 
						||
<a class="reference internal" href="../library/os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal notranslate"><span class="pre">stat()</span></code></a>, <a class="reference internal" href="../library/os.html#os.fstat" title="os.fstat"><code class="xref py py-func docutils literal notranslate"><span class="pre">fstat()</span></code></a>, <a class="reference internal" href="../library/os.html#os.statvfs" title="os.statvfs"><code class="xref py py-func docutils literal notranslate"><span class="pre">statvfs()</span></code></a>, and <a class="reference internal" href="../library/os.html#os.fstatvfs" title="os.fstatvfs"><code class="xref py py-func docutils literal notranslate"><span class="pre">fstatvfs()</span></code></a> in the
 | 
						||
<a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module, and <a class="reference internal" href="../library/time.html#time.localtime" title="time.localtime"><code class="xref py py-func docutils literal notranslate"><span class="pre">localtime()</span></code></a>, <a class="reference internal" href="../library/time.html#time.gmtime" title="time.gmtime"><code class="xref py py-func docutils literal notranslate"><span class="pre">gmtime()</span></code></a>, and <a class="reference internal" href="../library/time.html#time.strptime" title="time.strptime"><code class="xref py py-func docutils literal notranslate"><span class="pre">strptime()</span></code></a> in
 | 
						||
the <a class="reference internal" href="../library/time.html#module-time" title="time: Time access and conversions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">time</span></code></a> module.</p>
 | 
						||
<p>For example, to obtain a file’s size using the old tuples, you’d end up writing
 | 
						||
something like <code class="docutils literal notranslate"><span class="pre">file_size</span> <span class="pre">=</span> <span class="pre">os.stat(filename)[stat.ST_SIZE]</span></code>, but now this can
 | 
						||
be written more clearly as <code class="docutils literal notranslate"><span class="pre">file_size</span> <span class="pre">=</span> <span class="pre">os.stat(filename).st_size</span></code>.</p>
 | 
						||
<p>The original patch for this feature was contributed by Nick Mathewson.</p>
 | 
						||
</li>
 | 
						||
<li><p>The Python profiler has been extensively reworked and various errors in its
 | 
						||
output have been corrected.  (Contributed by Fred L. Drake, Jr. and Tim Peters.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/socket.html#module-socket" title="socket: Low-level networking interface."><code class="xref py py-mod docutils literal notranslate"><span class="pre">socket</span></code></a> module can be compiled to support IPv6; specify the
 | 
						||
<code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-ipv6</span></code> option to Python’s configure script.  (Contributed by
 | 
						||
Jun-ichiro “itojun” Hagino.)</p></li>
 | 
						||
<li><p>Two new format characters were added to the <a class="reference internal" href="../library/struct.html#module-struct" title="struct: Interpret bytes as packed binary data."><code class="xref py py-mod docutils literal notranslate"><span class="pre">struct</span></code></a> module for 64-bit
 | 
						||
integers on platforms that support the C <span class="c-expr sig sig-inline c"><span class="kt">long</span><span class="w"> </span><span class="kt">long</span></span> type.  <code class="docutils literal notranslate"><span class="pre">q</span></code> is for
 | 
						||
a signed 64-bit integer, and <code class="docutils literal notranslate"><span class="pre">Q</span></code> is for an unsigned one.  The value is
 | 
						||
returned in Python’s long integer type.  (Contributed by Tim Peters.)</p></li>
 | 
						||
<li><p>In the interpreter’s interactive mode, there’s a new built-in function
 | 
						||
<a class="reference internal" href="../library/functions.html#help" title="help"><code class="xref py py-func docutils literal notranslate"><span class="pre">help()</span></code></a> that uses the <a class="reference internal" href="../library/pydoc.html#module-pydoc" title="pydoc: Documentation generator and online help system."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pydoc</span></code></a> module introduced in Python 2.1 to
 | 
						||
provide interactive help. <code class="docutils literal notranslate"><span class="pre">help(object)</span></code> displays any available help text
 | 
						||
about <em>object</em>.  <a class="reference internal" href="../library/functions.html#help" title="help"><code class="xref py py-func docutils literal notranslate"><span class="pre">help()</span></code></a> with no argument puts you in an online help
 | 
						||
utility, where you can enter the names of functions, classes, or modules to read
 | 
						||
their help text. (Contributed by Guido van Rossum, using Ka-Ping Yee’s
 | 
						||
<a class="reference internal" href="../library/pydoc.html#module-pydoc" title="pydoc: Documentation generator and online help system."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pydoc</span></code></a> module.)</p></li>
 | 
						||
<li><p>Various bugfixes and performance improvements have been made to the SRE engine
 | 
						||
underlying the <a class="reference internal" href="../library/re.html#module-re" title="re: Regular expression operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">re</span></code></a> module.  For example, the <a class="reference internal" href="../library/re.html#re.sub" title="re.sub"><code class="xref py py-func docutils literal notranslate"><span class="pre">re.sub()</span></code></a> and
 | 
						||
<a class="reference internal" href="../library/re.html#re.split" title="re.split"><code class="xref py py-func docutils literal notranslate"><span class="pre">re.split()</span></code></a> functions have been rewritten in C.  Another contributed patch
 | 
						||
speeds up certain Unicode character ranges by a factor of two, and a new
 | 
						||
<a class="reference internal" href="../library/re.html#re.finditer" title="re.finditer"><code class="xref py py-meth docutils literal notranslate"><span class="pre">finditer()</span></code></a>  method that returns an iterator over all the non-overlapping
 | 
						||
matches in  a given string.  (SRE is maintained by Fredrik Lundh.  The
 | 
						||
BIGCHARSET patch was contributed by Martin von Löwis.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/smtplib.html#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> module now supports <span class="target" id="index-18"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2487.html"><strong>RFC 2487</strong></a>, “Secure SMTP over TLS”, so
 | 
						||
it’s now possible to encrypt the SMTP traffic between a Python program and the
 | 
						||
mail transport agent being handed a message.  <a class="reference internal" href="../library/smtplib.html#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> also supports SMTP
 | 
						||
authentication.  (Contributed by Gerhard Häring.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/imaplib.html#module-imaplib" title="imaplib: IMAP4 protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">imaplib</span></code></a> module, maintained by Piers Lauder, has support for several
 | 
						||
new extensions: the NAMESPACE extension defined in <span class="target" id="index-19"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2342.html"><strong>RFC 2342</strong></a>, SORT, GETACL and
 | 
						||
SETACL.  (Contributed by Anthony Baxter and Michel Pelletier.)</p></li>
 | 
						||
<li><p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">rfc822</span></code> module’s parsing of email addresses is now compliant with
 | 
						||
<span class="target" id="index-20"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2822.html"><strong>RFC 2822</strong></a>, an update to <span class="target" id="index-21"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc822.html"><strong>RFC 822</strong></a>.  (The module’s name is <em>not</em> going to be
 | 
						||
changed to <code class="docutils literal notranslate"><span class="pre">rfc2822</span></code>.)  A new package, <a class="reference internal" href="../library/email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a>, has also been added for
 | 
						||
parsing and generating e-mail messages.  (Contributed by Barry Warsaw, and
 | 
						||
arising out of his work on Mailman.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/difflib.html#module-difflib" title="difflib: Helpers for computing differences between objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">difflib</span></code></a> module now contains a new <code class="xref py py-class docutils literal notranslate"><span class="pre">Differ</span></code> class for
 | 
						||
producing human-readable lists of changes (a “delta”) between two sequences of
 | 
						||
lines of text.  There are also two generator functions, <code class="xref py py-func docutils literal notranslate"><span class="pre">ndiff()</span></code> and
 | 
						||
<code class="xref py py-func docutils literal notranslate"><span class="pre">restore()</span></code>, which respectively return a delta from two sequences, or one of
 | 
						||
the original sequences from a delta. (Grunt work contributed by David Goodger,
 | 
						||
from ndiff.py code by Tim Peters who then did the generatorization.)</p></li>
 | 
						||
<li><p>New constants <code class="xref py py-const docutils literal notranslate"><span class="pre">ascii_letters</span></code>, <code class="xref py py-const docutils literal notranslate"><span class="pre">ascii_lowercase</span></code>, and
 | 
						||
<code class="xref py py-const docutils literal notranslate"><span class="pre">ascii_uppercase</span></code> were added to the <a class="reference internal" href="../library/string.html#module-string" title="string: Common string operations."><code class="xref py py-mod docutils literal notranslate"><span class="pre">string</span></code></a> module.  There were
 | 
						||
several modules in the standard library that used <code class="xref py py-const docutils literal notranslate"><span class="pre">string.letters</span></code> to
 | 
						||
mean the ranges A-Za-z, but that assumption is incorrect when locales are in
 | 
						||
use, because <code class="xref py py-const docutils literal notranslate"><span class="pre">string.letters</span></code> varies depending on the set of legal
 | 
						||
characters defined by the current locale.  The buggy modules have all been fixed
 | 
						||
to use <code class="xref py py-const docutils literal notranslate"><span class="pre">ascii_letters</span></code> instead. (Reported by an unknown person; fixed by
 | 
						||
Fred L. Drake, Jr.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/mimetypes.html#module-mimetypes" title="mimetypes: Mapping of filename extensions to MIME types."><code class="xref py py-mod docutils literal notranslate"><span class="pre">mimetypes</span></code></a> module now makes it easier to use alternative MIME-type
 | 
						||
databases by the addition of a <a class="reference internal" href="../library/mimetypes.html#mimetypes.MimeTypes" title="mimetypes.MimeTypes"><code class="xref py py-class docutils literal notranslate"><span class="pre">MimeTypes</span></code></a> class, which takes a list of
 | 
						||
filenames to be parsed.  (Contributed by Fred L. Drake, Jr.)</p></li>
 | 
						||
<li><p>A <a class="reference internal" href="../library/threading.html#threading.Timer" title="threading.Timer"><code class="xref py py-class docutils literal notranslate"><span class="pre">Timer</span></code></a> class was added to the <a class="reference internal" href="../library/threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> module that allows
 | 
						||
scheduling an activity to happen at some future time.  (Contributed by Itamar
 | 
						||
Shtull-Trauring.)</p></li>
 | 
						||
</ul>
 | 
						||
</section>
 | 
						||
<section id="interpreter-changes-and-fixes">
 | 
						||
<h2>Interpreter Changes and Fixes<a class="headerlink" href="#interpreter-changes-and-fixes" title="Link to this heading">¶</a></h2>
 | 
						||
<p>Some of the changes only affect people who deal with the Python interpreter at
 | 
						||
the C level because they’re writing Python extension modules, embedding the
 | 
						||
interpreter, or just hacking on the interpreter itself. If you only write Python
 | 
						||
code, none of the changes described here will affect you very much.</p>
 | 
						||
<ul>
 | 
						||
<li><p>Profiling and tracing functions can now be implemented in C, which can operate
 | 
						||
at much higher speeds than Python-based functions and should reduce the overhead
 | 
						||
of profiling and tracing.  This  will be of interest to authors of development
 | 
						||
environments for Python.  Two new C functions were added to Python’s API,
 | 
						||
<a class="reference internal" href="../c-api/init.html#c.PyEval_SetProfile" title="PyEval_SetProfile"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_SetProfile()</span></code></a> and <a class="reference internal" href="../c-api/init.html#c.PyEval_SetTrace" title="PyEval_SetTrace"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyEval_SetTrace()</span></code></a>. The existing
 | 
						||
<a class="reference internal" href="../library/sys.html#sys.setprofile" title="sys.setprofile"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.setprofile()</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.settrace" title="sys.settrace"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.settrace()</span></code></a> functions still exist, and have
 | 
						||
simply been changed to use the new C-level interface.  (Contributed by Fred L.
 | 
						||
Drake, Jr.)</p></li>
 | 
						||
<li><p>Another low-level API, primarily of interest to implementers of Python
 | 
						||
debuggers and development tools, was added. <a class="reference internal" href="../c-api/init.html#c.PyInterpreterState_Head" title="PyInterpreterState_Head"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyInterpreterState_Head()</span></code></a> and
 | 
						||
<a class="reference internal" href="../c-api/init.html#c.PyInterpreterState_Next" title="PyInterpreterState_Next"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyInterpreterState_Next()</span></code></a> let a caller walk through all the existing
 | 
						||
interpreter objects; <a class="reference internal" href="../c-api/init.html#c.PyInterpreterState_ThreadHead" title="PyInterpreterState_ThreadHead"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyInterpreterState_ThreadHead()</span></code></a> and
 | 
						||
<a class="reference internal" href="../c-api/init.html#c.PyThreadState_Next" title="PyThreadState_Next"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyThreadState_Next()</span></code></a> allow looping over all the thread states for a given
 | 
						||
interpreter.  (Contributed by David Beazley.)</p></li>
 | 
						||
<li><p>The C-level interface to the garbage collector has been changed to make it
 | 
						||
easier to write extension types that support garbage collection and to debug
 | 
						||
misuses of the functions. Various functions have slightly different semantics,
 | 
						||
so a bunch of functions had to be renamed.  Extensions that use the old API will
 | 
						||
still compile but will <em>not</em> participate in garbage collection, so updating them
 | 
						||
for 2.2 should be considered fairly high priority.</p>
 | 
						||
<p>To upgrade an extension module to the new API, perform the following steps:</p>
 | 
						||
</li>
 | 
						||
<li><p>Rename <code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_GC</span></code> to <a class="reference internal" href="../c-api/typeobj.html#c.Py_TPFLAGS_HAVE_GC" title="Py_TPFLAGS_HAVE_GC"><code class="xref c c-macro docutils literal notranslate"><span class="pre">Py_TPFLAGS_HAVE_GC</span></code></a>.</p></li>
 | 
						||
<li><dl class="simple">
 | 
						||
<dt>Use <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_New" title="PyObject_GC_New"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_New()</span></code></a> or <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_NewVar" title="PyObject_GC_NewVar"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_NewVar()</span></code></a> to allocate</dt><dd><p>objects, and <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_Del" title="PyObject_GC_Del"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_Del()</span></code></a> to deallocate them.</p>
 | 
						||
</dd>
 | 
						||
</dl>
 | 
						||
</li>
 | 
						||
<li><p>Rename <code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_Init()</span></code> to <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_Track" title="PyObject_GC_Track"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_Track()</span></code></a> and
 | 
						||
<code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_Fini()</span></code> to <a class="reference internal" href="../c-api/gcsupport.html#c.PyObject_GC_UnTrack" title="PyObject_GC_UnTrack"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_GC_UnTrack()</span></code></a>.</p></li>
 | 
						||
<li><p>Remove <code class="xref c c-macro docutils literal notranslate"><span class="pre">PyGC_HEAD_SIZE</span></code> from object size calculations.</p></li>
 | 
						||
<li><p>Remove calls to <code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_AS_GC()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">PyObject_FROM_GC()</span></code>.</p></li>
 | 
						||
<li><p>A new <code class="docutils literal notranslate"><span class="pre">et</span></code> format sequence was added to <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTuple" title="PyArg_ParseTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTuple()</span></code></a>; <code class="docutils literal notranslate"><span class="pre">et</span></code>
 | 
						||
takes both a parameter and an encoding name, and converts the parameter to the
 | 
						||
given encoding if the parameter turns out to be a Unicode string, or leaves it
 | 
						||
alone if it’s an 8-bit string, assuming it to already be in the desired
 | 
						||
encoding.  This differs from the <code class="docutils literal notranslate"><span class="pre">es</span></code> format character, which assumes that
 | 
						||
8-bit strings are in Python’s default ASCII encoding and converts them to the
 | 
						||
specified new encoding. (Contributed by M.-A. Lemburg, and used for the MBCS
 | 
						||
support on Windows described in the following section.)</p></li>
 | 
						||
<li><p>A different argument parsing function, <a class="reference internal" href="../c-api/arg.html#c.PyArg_UnpackTuple" title="PyArg_UnpackTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_UnpackTuple()</span></code></a>, has been
 | 
						||
added that’s simpler and presumably faster.  Instead of specifying a format
 | 
						||
string, the caller simply gives the minimum and maximum number of arguments
 | 
						||
expected, and a set of pointers to <span class="c-expr sig sig-inline c"><a class="reference internal" href="../c-api/structures.html#c.PyObject" title="PyObject"><span class="n">PyObject</span></a><span class="p">*</span></span> variables that will be
 | 
						||
filled in with argument values.</p></li>
 | 
						||
<li><p>Two new flags <a class="reference internal" href="../c-api/structures.html#c.METH_NOARGS" title="METH_NOARGS"><code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_NOARGS</span></code></a> and <a class="reference internal" href="../c-api/structures.html#c.METH_O" title="METH_O"><code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_O</span></code></a> are available in method
 | 
						||
definition tables to simplify implementation of methods with no arguments or a
 | 
						||
single untyped argument. Calling such methods is more efficient than calling a
 | 
						||
corresponding method that uses <a class="reference internal" href="../c-api/structures.html#c.METH_VARARGS" title="METH_VARARGS"><code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_VARARGS</span></code></a>.  Also, the old
 | 
						||
<code class="xref c c-macro docutils literal notranslate"><span class="pre">METH_OLDARGS</span></code> style of writing C methods is  now officially deprecated.</p></li>
 | 
						||
<li><p>Two new wrapper functions, <a class="reference internal" href="../c-api/conversion.html#c.PyOS_snprintf" title="PyOS_snprintf"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyOS_snprintf()</span></code></a> and <a class="reference internal" href="../c-api/conversion.html#c.PyOS_vsnprintf" title="PyOS_vsnprintf"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyOS_vsnprintf()</span></code></a>
 | 
						||
were added to provide  cross-platform implementations for the relatively new
 | 
						||
<code class="xref c c-func docutils literal notranslate"><span class="pre">snprintf()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">vsnprintf()</span></code> C lib APIs. In contrast to the standard
 | 
						||
<code class="xref c c-func docutils literal notranslate"><span class="pre">sprintf()</span></code> and <code class="xref c c-func docutils literal notranslate"><span class="pre">vsprintf()</span></code> functions, the Python versions check the
 | 
						||
bounds of the buffer used to protect against buffer overruns. (Contributed by
 | 
						||
M.-A. Lemburg.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../c-api/tuple.html#c._PyTuple_Resize" title="_PyTuple_Resize"><code class="xref c c-func docutils literal notranslate"><span class="pre">_PyTuple_Resize()</span></code></a> function has lost an unused parameter, so now it
 | 
						||
takes 2 parameters instead of 3.  The third argument was never used, and can
 | 
						||
simply be discarded when porting code from earlier versions to Python 2.2.</p></li>
 | 
						||
</ul>
 | 
						||
</section>
 | 
						||
<section id="other-changes-and-fixes">
 | 
						||
<h2>Other Changes and Fixes<a class="headerlink" href="#other-changes-and-fixes" title="Link to this heading">¶</a></h2>
 | 
						||
<p>As usual there were a bunch of other improvements and bugfixes scattered
 | 
						||
throughout the source tree.  A search through the CVS change logs finds there
 | 
						||
were 527 patches applied and 683 bugs fixed between Python 2.1 and 2.2; 2.2.1
 | 
						||
applied 139 patches and fixed 143 bugs; 2.2.2 applied 106 patches and fixed 82
 | 
						||
bugs.  These figures are likely to be underestimates.</p>
 | 
						||
<p>Some of the more notable changes are:</p>
 | 
						||
<ul>
 | 
						||
<li><p>The code for the MacOS port for Python, maintained by Jack Jansen, is now kept
 | 
						||
in the main Python CVS tree, and many changes have been made to support MacOS X.</p>
 | 
						||
<p>The most significant change is the ability to build Python as a framework,
 | 
						||
enabled by supplying the <code class="xref std std-option docutils literal notranslate"><span class="pre">--enable-framework</span></code> option to the configure
 | 
						||
script when compiling Python.  According to Jack Jansen, “This installs a
 | 
						||
self-contained Python installation plus the OS X framework “glue” into
 | 
						||
<code class="file docutils literal notranslate"><span class="pre">/Library/Frameworks/Python.framework</span></code> (or another location of choice).
 | 
						||
For now there is little immediate added benefit to this (actually, there is the
 | 
						||
disadvantage that you have to change your PATH to be able to find Python), but
 | 
						||
it is the basis for creating a full-blown Python application, porting the
 | 
						||
MacPython IDE, possibly using Python as a standard OSA scripting language and
 | 
						||
much more.”</p>
 | 
						||
<p>Most of the MacPython toolbox modules, which interface to MacOS APIs such as
 | 
						||
windowing, QuickTime, scripting, etc. have been ported to OS X, but they’ve been
 | 
						||
left commented out in <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code>.  People who want to experiment with
 | 
						||
these modules can uncomment them manually.</p>
 | 
						||
</li>
 | 
						||
<li><p>Keyword arguments passed to built-in functions that don’t take them now cause a
 | 
						||
<a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> exception to be raised, with the message “<em>function</em> takes no
 | 
						||
keyword arguments”.</p></li>
 | 
						||
<li><p>Weak references, added in Python 2.1 as an extension module, are now part of
 | 
						||
the core because they’re used in the implementation of new-style classes.  The
 | 
						||
<a class="reference internal" href="../library/exceptions.html#ReferenceError" title="ReferenceError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ReferenceError</span></code></a> exception has therefore moved from the <a class="reference internal" href="../library/weakref.html#module-weakref" title="weakref: Support for weak references and weak dictionaries."><code class="xref py py-mod docutils literal notranslate"><span class="pre">weakref</span></code></a>
 | 
						||
module to become a built-in exception.</p></li>
 | 
						||
<li><p>A new script, <code class="file docutils literal notranslate"><span class="pre">Tools/scripts/cleanfuture.py</span></code> by Tim Peters,
 | 
						||
automatically removes obsolete <code class="docutils literal notranslate"><span class="pre">__future__</span></code> statements from Python source
 | 
						||
code.</p></li>
 | 
						||
<li><p>An additional <em>flags</em> argument has been added to the built-in function
 | 
						||
<a class="reference internal" href="../library/functions.html#compile" title="compile"><code class="xref py py-func docutils literal notranslate"><span class="pre">compile()</span></code></a>, so the behaviour of <code class="docutils literal notranslate"><span class="pre">__future__</span></code> statements can now be
 | 
						||
correctly observed in simulated shells, such as those presented by IDLE and
 | 
						||
other development environments.  This is described in <span class="target" id="index-22"></span><a class="pep reference external" href="https://peps.python.org/pep-0264/"><strong>PEP 264</strong></a>. (Contributed
 | 
						||
by Michael Hudson.)</p></li>
 | 
						||
<li><p>The new license introduced with Python 1.6 wasn’t GPL-compatible.  This is
 | 
						||
fixed by some minor textual changes to the 2.2 license, so it’s now legal to
 | 
						||
embed Python inside a GPLed program again.  Note that Python itself is not
 | 
						||
GPLed, but instead is under a license that’s essentially equivalent to the BSD
 | 
						||
license, same as it always was.  The license changes were also applied to the
 | 
						||
Python 2.0.1 and 2.1.1 releases.</p></li>
 | 
						||
<li><p>When presented with a Unicode filename on Windows, Python will now convert it
 | 
						||
to an MBCS encoded string, as used by the Microsoft file APIs.  As MBCS is
 | 
						||
explicitly used by the file APIs, Python’s choice of ASCII as the default
 | 
						||
encoding turns out to be an annoyance.  On Unix, the locale’s character set is
 | 
						||
used if <code class="docutils literal notranslate"><span class="pre">locale.nl_langinfo(CODESET)</span></code> is available.  (Windows support was
 | 
						||
contributed by Mark Hammond with assistance from Marc-André Lemburg. Unix
 | 
						||
support was added by Martin von Löwis.)</p></li>
 | 
						||
<li><p>Large file support is now enabled on Windows.  (Contributed by Tim Peters.)</p></li>
 | 
						||
<li><p>The <code class="file docutils literal notranslate"><span class="pre">Tools/scripts/ftpmirror.py</span></code> script now parses a <code class="file docutils literal notranslate"><span class="pre">.netrc</span></code>
 | 
						||
file, if you have one. (Contributed by Mike Romberg.)</p></li>
 | 
						||
<li><p>Some features of the object returned by the <code class="xref py py-func docutils literal notranslate"><span class="pre">xrange()</span></code> function are now
 | 
						||
deprecated, and trigger warnings when they’re accessed; they’ll disappear in
 | 
						||
Python 2.3. <code class="xref py py-class docutils literal notranslate"><span class="pre">xrange</span></code> objects tried to pretend they were full sequence
 | 
						||
types by supporting slicing, sequence multiplication, and the <a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">in</span></code></a>
 | 
						||
operator, but these features were rarely used and therefore buggy.  The
 | 
						||
<code class="xref py py-meth docutils literal notranslate"><span class="pre">tolist()</span></code> method and the <code class="xref py py-attr docutils literal notranslate"><span class="pre">start</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">stop</span></code>, and <code class="xref py py-attr docutils literal notranslate"><span class="pre">step</span></code>
 | 
						||
attributes are also being deprecated.  At the C level, the fourth argument to
 | 
						||
the <code class="xref c c-func docutils literal notranslate"><span class="pre">PyRange_New()</span></code> function, <code class="docutils literal notranslate"><span class="pre">repeat</span></code>, has also been deprecated.</p></li>
 | 
						||
<li><p>There were a bunch of patches to the dictionary implementation, mostly to fix
 | 
						||
potential core dumps if a dictionary contains objects that sneakily changed
 | 
						||
their hash value, or mutated the dictionary they were contained in. For a while
 | 
						||
python-dev fell into a gentle rhythm of Michael Hudson finding a case that
 | 
						||
dumped core, Tim Peters fixing the bug, Michael finding another case, and round
 | 
						||
and round it went.</p></li>
 | 
						||
<li><p>On Windows, Python can now be compiled with Borland C thanks to a number of
 | 
						||
patches contributed by Stephen Hansen, though the result isn’t fully functional
 | 
						||
yet.  (But this <em>is</em> progress…)</p></li>
 | 
						||
<li><p>Another Windows enhancement: Wise Solutions generously offered PythonLabs use
 | 
						||
of their InstallerMaster 8.1 system.  Earlier PythonLabs Windows installers used
 | 
						||
Wise 5.0a, which was beginning to show its age.  (Packaged up by Tim Peters.)</p></li>
 | 
						||
<li><p>Files ending in <code class="docutils literal notranslate"><span class="pre">.pyw</span></code> can now be imported on Windows. <code class="docutils literal notranslate"><span class="pre">.pyw</span></code> is a
 | 
						||
Windows-only thing, used to indicate that a script needs to be run using
 | 
						||
PYTHONW.EXE instead of PYTHON.EXE in order to prevent a DOS console from popping
 | 
						||
up to display the output.  This patch makes it possible to import such scripts,
 | 
						||
in case they’re also usable as modules.  (Implemented by David Bolen.)</p></li>
 | 
						||
<li><p>On platforms where Python uses the C <code class="xref c c-func docutils literal notranslate"><span class="pre">dlopen()</span></code> function  to load
 | 
						||
extension modules, it’s now possible to set the flags used  by <code class="xref c c-func docutils literal notranslate"><span class="pre">dlopen()</span></code>
 | 
						||
using the <a class="reference internal" href="../library/sys.html#sys.getdlopenflags" title="sys.getdlopenflags"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.getdlopenflags()</span></code></a> and <a class="reference internal" href="../library/sys.html#sys.setdlopenflags" title="sys.setdlopenflags"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.setdlopenflags()</span></code></a> functions.
 | 
						||
(Contributed by Bram Stolk.)</p></li>
 | 
						||
<li><p>The <a class="reference internal" href="../library/functions.html#pow" title="pow"><code class="xref py py-func docutils literal notranslate"><span class="pre">pow()</span></code></a> built-in function no longer supports 3 arguments when
 | 
						||
floating-point numbers are supplied. <code class="docutils literal notranslate"><span class="pre">pow(x,</span> <span class="pre">y,</span> <span class="pre">z)</span></code> returns <code class="docutils literal notranslate"><span class="pre">(x**y)</span> <span class="pre">%</span> <span class="pre">z</span></code>,
 | 
						||
but this is never useful for floating-point numbers, and the final result varies
 | 
						||
unpredictably depending on the platform.  A call such as <code class="docutils literal notranslate"><span class="pre">pow(2.0,</span> <span class="pre">8.0,</span> <span class="pre">7.0)</span></code>
 | 
						||
will now raise a <a class="reference internal" href="../library/exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> exception.</p></li>
 | 
						||
</ul>
 | 
						||
</section>
 | 
						||
<section id="acknowledgements">
 | 
						||
<h2>Acknowledgements<a class="headerlink" href="#acknowledgements" title="Link to this heading">¶</a></h2>
 | 
						||
<p>The author would like to thank the following people for offering suggestions,
 | 
						||
corrections and assistance with various drafts of this article: Fred Bremmer,
 | 
						||
Keith Briggs, Andrew Dalke, Fred L. Drake, Jr., Carel Fellinger, David Goodger,
 | 
						||
Mark Hammond, Stephen Hansen, Michael Hudson, Jack Jansen, Marc-André Lemburg,
 | 
						||
Martin von Löwis, Fredrik Lundh, Michael McLay, Nick Mathewson, Paul Moore,
 | 
						||
Gustavo Niemeyer, Don O’Donnell, Joonas Paalasma, Tim Peters, Jens Quade, Tom
 | 
						||
Reinhardt, Neil Schemenauer, Guido van Rossum, Greg Ward, Edward Welbourne.</p>
 | 
						||
</section>
 | 
						||
</section>
 | 
						||
 | 
						||
 | 
						||
            <div class="clearer"></div>
 | 
						||
          </div>
 | 
						||
        </div>
 | 
						||
      </div>
 | 
						||
      <div class="sphinxsidebar" role="navigation" aria-label="Main">
 | 
						||
        <div class="sphinxsidebarwrapper">
 | 
						||
  <div>
 | 
						||
    <h3><a href="../contents.html">Table of Contents</a></h3>
 | 
						||
    <ul>
 | 
						||
<li><a class="reference internal" href="#">What’s New in Python 2.2</a><ul>
 | 
						||
<li><a class="reference internal" href="#introduction">Introduction</a></li>
 | 
						||
<li><a class="reference internal" href="#peps-252-and-253-type-and-class-changes">PEPs 252 and 253: Type and Class Changes</a><ul>
 | 
						||
<li><a class="reference internal" href="#old-and-new-classes">Old and New Classes</a></li>
 | 
						||
<li><a class="reference internal" href="#descriptors">Descriptors</a></li>
 | 
						||
<li><a class="reference internal" href="#multiple-inheritance-the-diamond-rule">Multiple Inheritance: The Diamond Rule</a></li>
 | 
						||
<li><a class="reference internal" href="#attribute-access">Attribute Access</a></li>
 | 
						||
<li><a class="reference internal" href="#related-links">Related Links</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li><a class="reference internal" href="#pep-234-iterators">PEP 234: Iterators</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-255-simple-generators">PEP 255: Simple Generators</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-237-unifying-long-integers-and-integers">PEP 237: Unifying Long Integers and Integers</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-238-changing-the-division-operator">PEP 238: Changing the Division Operator</a></li>
 | 
						||
<li><a class="reference internal" href="#unicode-changes">Unicode Changes</a></li>
 | 
						||
<li><a class="reference internal" href="#pep-227-nested-scopes">PEP 227: Nested Scopes</a></li>
 | 
						||
<li><a class="reference internal" href="#new-and-improved-modules">New and Improved Modules</a></li>
 | 
						||
<li><a class="reference internal" href="#interpreter-changes-and-fixes">Interpreter Changes and Fixes</a></li>
 | 
						||
<li><a class="reference internal" href="#other-changes-and-fixes">Other Changes and Fixes</a></li>
 | 
						||
<li><a class="reference internal" href="#acknowledgements">Acknowledgements</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
</ul>
 | 
						||
 | 
						||
  </div>
 | 
						||
  <div>
 | 
						||
    <h4>Previous topic</h4>
 | 
						||
    <p class="topless"><a href="2.3.html"
 | 
						||
                          title="previous chapter">What’s New in Python 2.3</a></p>
 | 
						||
  </div>
 | 
						||
  <div>
 | 
						||
    <h4>Next topic</h4>
 | 
						||
    <p class="topless"><a href="2.1.html"
 | 
						||
                          title="next chapter">What’s New in Python 2.1</a></p>
 | 
						||
  </div>
 | 
						||
  <div role="note" aria-label="source link">
 | 
						||
    <h3>This Page</h3>
 | 
						||
    <ul class="this-page-menu">
 | 
						||
      <li><a href="../bugs.html">Report a Bug</a></li>
 | 
						||
      <li>
 | 
						||
        <a href="https://github.com/python/cpython/blob/main/Doc/whatsnew/2.2.rst"
 | 
						||
            rel="nofollow">Show Source
 | 
						||
        </a>
 | 
						||
      </li>
 | 
						||
    </ul>
 | 
						||
  </div>
 | 
						||
        </div>
 | 
						||
<div id="sidebarbutton" title="Collapse sidebar">
 | 
						||
<span>«</span>
 | 
						||
</div>
 | 
						||
 | 
						||
      </div>
 | 
						||
      <div class="clearer"></div>
 | 
						||
    </div>  
 | 
						||
    <div class="related" role="navigation" aria-label="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="../py-modindex.html" title="Python Module Index"
 | 
						||
             >modules</a> |</li>
 | 
						||
        <li class="right" >
 | 
						||
          <a href="2.1.html" title="What’s New in Python 2.1"
 | 
						||
             >next</a> |</li>
 | 
						||
        <li class="right" >
 | 
						||
          <a href="2.3.html" title="What’s New in Python 2.3"
 | 
						||
             >previous</a> |</li>
 | 
						||
 | 
						||
          <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
 | 
						||
          <li><a href="https://www.python.org/">Python</a> »</li>
 | 
						||
          <li class="switchers">
 | 
						||
            <div class="language_switcher_placeholder"></div>
 | 
						||
            <div class="version_switcher_placeholder"></div>
 | 
						||
          </li>
 | 
						||
          <li>
 | 
						||
              
 | 
						||
          </li>
 | 
						||
    <li id="cpython-language-and-version">
 | 
						||
      <a href="../index.html">3.13.3 Documentation</a> »
 | 
						||
    </li>
 | 
						||
 | 
						||
          <li class="nav-item nav-item-1"><a href="index.html" >What’s New in Python</a> »</li>
 | 
						||
        <li class="nav-item nav-item-this"><a href="">What’s New in Python 2.2</a></li>
 | 
						||
                <li class="right">
 | 
						||
                    
 | 
						||
 | 
						||
    <div class="inline-search" role="search">
 | 
						||
        <form class="inline-search" action="../search.html" method="get">
 | 
						||
          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
 | 
						||
          <input type="submit" value="Go" />
 | 
						||
        </form>
 | 
						||
    </div>
 | 
						||
                     |
 | 
						||
                </li>
 | 
						||
            <li class="right">
 | 
						||
<label class="theme-selector-label">
 | 
						||
    Theme
 | 
						||
    <select class="theme-selector" oninput="activateTheme(this.value)">
 | 
						||
        <option value="auto" selected>Auto</option>
 | 
						||
        <option value="light">Light</option>
 | 
						||
        <option value="dark">Dark</option>
 | 
						||
    </select>
 | 
						||
</label> |</li>
 | 
						||
            
 | 
						||
      </ul>
 | 
						||
    </div>  
 | 
						||
    <div class="footer">
 | 
						||
    © 
 | 
						||
      <a href="../copyright.html">
 | 
						||
    
 | 
						||
    Copyright
 | 
						||
    
 | 
						||
      </a>
 | 
						||
     2001-2025, Python Software Foundation.
 | 
						||
    <br />
 | 
						||
    This page is licensed under the Python Software Foundation License Version 2.
 | 
						||
    <br />
 | 
						||
    Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
 | 
						||
    <br />
 | 
						||
    
 | 
						||
      See <a href="/license.html">History and License</a> for more information.<br />
 | 
						||
    
 | 
						||
    
 | 
						||
    <br />
 | 
						||
 | 
						||
    The Python Software Foundation is a non-profit corporation.
 | 
						||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
 | 
						||
<br />
 | 
						||
    <br />
 | 
						||
      Last updated on Apr 08, 2025 (14:33 UTC).
 | 
						||
    
 | 
						||
      <a href="/bugs.html">Found a bug</a>?
 | 
						||
    
 | 
						||
    <br />
 | 
						||
 | 
						||
    Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
 | 
						||
    </div>
 | 
						||
 | 
						||
  </body>
 | 
						||
</html> |