Commits

Bruce Eckel committed 3d2d548

More and better on the metaclasses chapter.

Comments (0)

Files changed (12)

 .swp
 _build
 _deltas
-_test
+_test

code/.DS_Store

Binary file modified.

code/Metaclasses/Final.py

+# Metaclasses/Final.py
+# Emulating Java's 'final'
+
+class final(type):
+    def __init__(cls, name, bases, namespace):
+        for klass in bases:
+            if isinstance(klass, final):
+                raise TypeError(str(klass.__name__) + " is final")
+        super(final, cls).__init__(name, bases, namespace)
+
+class A(object):
+    pass
+
+class B(A):
+    __metaclass__= final
+
+# Produces compile-time error:
+class C(B):
+    pass
+
+""" Output:
+...
+TypeError: B is final
+"""

code/Metaclasses/GreenHouse.py

     exec initializations in globals()
     [create_exec(dsc) for dsc in descriptions]
     exec initializations in globals()
-    Event.run_events()
+    Event.run_events()
+
+""" Output:
+1.00: Light on [mc]
+1.00: Light on [exec]
+2.00: Light off [mc]
+2.00: Light off [exec]
+3.30: Water on [mc]
+3.30: Water on [exec]
+4.45: Water off [mc]
+4.45: Water off [exec]
+5.00: Thermostat night [mc]
+5.00: Thermostat night [exec]
+6.00: Thermostat day [mc]
+6.00: Thermostat day [exec]
+7.00: Ring bell [mc]
+7.00: Ring bell [exec]
+"""

code/Metaclasses/MyList.py

 ml.append("Camembert")
 print(ml)
 print(ml.x)
-ml.howdy("John")
+ml.howdy("John")
+
+""" Output:
+['Camembert']
+42
+Howdy, John
+"""

code/Metaclasses/Singleton.py

+# Metaclasses/Singleton.py
+
+class Singleton(type):
+    instance = None
+    def __call__(cls, *args, **kw):
+        if not cls.instance:
+             cls.instance = super(Singleton, cls).__call__(*args, **kw)
+        return cls.instance
+
+class ASingleton(object):
+    __metaclass__ = Singleton
+
+a = ASingleton()
+b = ASingleton()
+assert a is b
+print(a.__class__.__name__, b.__class__.__name__)
+
+class BSingleton(object):
+    __metaclass__ = Singleton
+
+c = BSingleton()
+d = BSingleton()
+assert c is d
+print(c.__class__.__name__, d.__class__.__name__)
+assert c is not a
+
+""" Output:
+('ASingleton', 'ASingleton')
+('BSingleton', 'BSingleton')
+"""

html/Metaclasses.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Metaclasses &mdash; Python 3 Patterns, Recipes and Idioms</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="top" title="Python 3 Patterns, Recipes and Idioms" href="index.html" />
+    <link rel="next" title="Jython" href="Jython.html" />
+    <link rel="prev" title="Coroutines & Concurrency" href="CoroutinesAndConcurrency.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="Jython.html" title="Jython"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="CoroutinesAndConcurrency.html" title="Coroutines & Concurrency"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">Python 3 Patterns, Recipes and Idioms</a> &raquo;</li> 
+      </ul>
+    </div>  
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="metaclasses">
+<span id="index-29"></span><h1>Metaclasses<a class="headerlink" href="#metaclasses" title="Permalink to this headline">¶</a></h1>
+<p>Objects are created by other objects: special objects called &#8220;classes&#8221;
+that we can set up to spit out objects that are configured to our
+liking. What creates these special &#8220;class&#8221; objects, though? Class
+objects are created by other special objects, called metaclasses.</p>
+<p>The default metaclass is called <tt class="docutils literal"><span class="pre">type</span></tt> and in the vast majority of
+cases it does the right thing. In some situations, however, you can
+gain leverage by modifying the way that classes are produced &#8211;
+typically by performing extra actions or injecting code. When this is
+the case, you can use <em>metaclass</em> programming to modify the way that
+some of your class objects are created.</p>
+<p>It&#8217;s worth re-emphasizing that in <em>the vast majority of cases, you
+don&#8217;t need metaclasses</em>, because it&#8217;s a fascinating toy and the
+temptation to use it everywhere can be overwhelming. Some of the
+examples in this chapter will show both metaclass and non-metaclass
+solutions to a problem, so you can see that there&#8217;s usually another
+(often simpler) approach.</p>
+<p>Some of the functionality that was previously only available with
+metaclasses is now available in a simpler form using class
+decorators. It is still useful, however, to understand metaclasses,
+and certain results can still be achieved only through metaclass
+programming.</p>
+<div class="section" id="basic-metaclasses">
+<h2>Basic Metaclasses<a class="headerlink" href="#basic-metaclasses" title="Permalink to this headline">¶</a></h2>
+<p>So metaclasses create classes, and classes create instances. Normally
+when we write a class, the default metaclass <tt class="docutils literal"><span class="pre">type</span></tt> is automatically
+invoked to create that class, and we aren&#8217;t even aware that it&#8217;s happening.</p>
+<p>It&#8217;s possible to explicitly code the metaclass&#8217; creation of a
+class. <tt class="docutils literal"><span class="pre">type</span></tt> called with one argument produces the type information
+of an existing class; <tt class="docutils literal"><span class="pre">type</span></tt> called with three arguments creates a
+new class object. The arguments when invoking <tt class="docutils literal"><span class="pre">type</span></tt> are the name of the class,
+a list of base classes, and a dictionary giving the namespace for the
+class (all the fields and methods). So the equivalent of:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">C</span><span class="p">:</span> <span class="k">pass</span>
+</pre></div>
+</div>
+<p>is:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">C</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="s">&#39;C&#39;</span><span class="p">,</span> <span class="p">(),</span> <span class="p">{})</span>
+</pre></div>
+</div>
+<p>Classes are often referred to as &#8220;types,&#8221; so this reads fairly
+sensibly: you&#8217;re calling a function that creates a new type based on
+its arguments.</p>
+<p>We can also add base classes, fields and methods:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/MyList.py</span>
+
+<span class="k">def</span> <span class="nf">howdy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">you</span><span class="p">):</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Howdy, &quot;</span> <span class="o">+</span> <span class="n">you</span><span class="p">)</span>
+
+<span class="n">MyList</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="s">&#39;MyList&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,),</span> <span class="nb">dict</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mf">42</span><span class="p">,</span> <span class="n">howdy</span><span class="o">=</span><span class="n">howdy</span><span class="p">))</span>
+
+<span class="n">ml</span> <span class="o">=</span> <span class="n">MyList</span><span class="p">()</span>
+<span class="n">ml</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;Camembert&quot;</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">ml</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">ml</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
+<span class="n">ml</span><span class="o">.</span><span class="n">howdy</span><span class="p">(</span><span class="s">&quot;John&quot;</span><span class="p">)</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">[&#39;Camembert&#39;]</span>
+<span class="sd">42</span>
+<span class="sd">Howdy, John</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>The ability to generate classes programmatically using <tt class="docutils literal"><span class="pre">type</span></tt> opens
+up some interesting possibilities. Consider the GreenHouseLanguage.py
+example in the Jython chapter &#8211; all the subclasses in that case were
+written using repetetive code. We can automate the generation of the
+subclasses using <tt class="docutils literal"><span class="pre">type</span></tt>:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/GreenHouse.py</span>
+
+<span class="k">class</span> <span class="nc">Event</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">events</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># static</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">=</span> <span class="n">action</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="n">time</span>
+        <span class="n">Event</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">__cmp__</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+        <span class="s">&quot;So sort() will compare only on time.&quot;</span>
+        <span class="k">return</span> <span class="nb">cmp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">time</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%.2f</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span><span class="p">))</span>
+
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">run_events</span><span class="p">():</span>
+        <span class="n">Event</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">sort</span><span class="p">();</span>
+        <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">Event</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
+            <span class="n">e</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+
+<span class="k">def</span> <span class="nf">create_mc</span><span class="p">(</span><span class="n">description</span><span class="p">):</span>
+    <span class="s">&quot;Create subclass using the &#39;type&#39; metaclass&quot;</span>
+    <span class="n">class_name</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">description</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+        <span class="n">Event</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">description</span> <span class="o">+</span> <span class="s">&quot; [mc]&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+    <span class="nb">globals</span><span class="p">()[</span><span class="n">class_name</span><span class="p">]</span> <span class="o">=</span> \
+        <span class="nb">type</span><span class="p">(</span><span class="n">class_name</span><span class="p">,</span> <span class="p">(</span><span class="n">Event</span><span class="p">,),</span> <span class="nb">dict</span><span class="p">(</span><span class="n">__init__</span> <span class="o">=</span> <span class="n">__init__</span><span class="p">))</span>
+
+<span class="k">def</span> <span class="nf">create_exec</span><span class="p">(</span><span class="n">description</span><span class="p">):</span>
+    <span class="s">&quot;Create subclass by exec-ing a string&quot;</span>
+    <span class="n">class_name</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">description</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
+    <span class="n">klass</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
+<span class="s">class </span><span class="si">%s</span><span class="s">(Event):</span>
+<span class="s">    def __init__(self, time):</span>
+<span class="s">        Event.__init__(self, &quot;</span><span class="si">%s</span><span class="s"> [exec]&quot;, time)</span>
+<span class="s">&quot;&quot;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">class_name</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+    <span class="k">exec</span> <span class="n">klass</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">descriptions</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Light on&quot;</span><span class="p">,</span> <span class="s">&quot;Light off&quot;</span><span class="p">,</span> <span class="s">&quot;Water on&quot;</span><span class="p">,</span> <span class="s">&quot;Water off&quot;</span><span class="p">,</span>
+                    <span class="s">&quot;Thermostat night&quot;</span><span class="p">,</span> <span class="s">&quot;Thermostat day&quot;</span><span class="p">,</span> <span class="s">&quot;Ring bell&quot;</span><span class="p">]</span>
+    <span class="n">initializations</span> <span class="o">=</span> <span class="s">&quot;ThermostatNight(5.00); LightOff(2.00); </span><span class="se">\</span>
+<span class="s">        WaterOn(3.30); WaterOff(4.45); LightOn(1.00); </span><span class="se">\</span>
+<span class="s">        RingBell(7.00); ThermostatDay(6.00)&quot;</span>
+    <span class="p">[</span><span class="n">create_mc</span><span class="p">(</span><span class="n">dsc</span><span class="p">)</span> <span class="k">for</span> <span class="n">dsc</span> <span class="ow">in</span> <span class="n">descriptions</span><span class="p">]</span>
+    <span class="k">exec</span> <span class="n">initializations</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">()</span>
+    <span class="p">[</span><span class="n">create_exec</span><span class="p">(</span><span class="n">dsc</span><span class="p">)</span> <span class="k">for</span> <span class="n">dsc</span> <span class="ow">in</span> <span class="n">descriptions</span><span class="p">]</span>
+    <span class="k">exec</span> <span class="n">initializations</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">()</span>
+    <span class="n">Event</span><span class="o">.</span><span class="n">run_events</span><span class="p">()</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">1.00: Light on [mc]</span>
+<span class="sd">1.00: Light on [exec]</span>
+<span class="sd">2.00: Light off [mc]</span>
+<span class="sd">2.00: Light off [exec]</span>
+<span class="sd">3.30: Water on [mc]</span>
+<span class="sd">3.30: Water on [exec]</span>
+<span class="sd">4.45: Water off [mc]</span>
+<span class="sd">4.45: Water off [exec]</span>
+<span class="sd">5.00: Thermostat night [mc]</span>
+<span class="sd">5.00: Thermostat night [exec]</span>
+<span class="sd">6.00: Thermostat day [mc]</span>
+<span class="sd">6.00: Thermostat day [exec]</span>
+<span class="sd">7.00: Ring bell [mc]</span>
+<span class="sd">7.00: Ring bell [exec]</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>The <tt class="docutils literal"><span class="pre">Event</span></tt> base class is the same. The classes are created
+automatically using the <tt class="docutils literal"><span class="pre">create_mc()</span></tt> function, which takes its
+<tt class="docutils literal"><span class="pre">description</span></tt> argument and generates a class name from it. Then it
+defines an <tt class="docutils literal"><span class="pre">__init__()</span></tt> method, which it puts into the namespace
+dictionary for the <tt class="docutils literal"><span class="pre">type</span></tt> call, producing a new subclass of
+<tt class="docutils literal"><span class="pre">Event</span></tt>. Note that the resulting class must be inserted into the
+global namespace, otherwise it will not be seen.</p>
+<p>This approach works fine, but then consider the subsequent
+<tt class="docutils literal"><span class="pre">create_exec()</span></tt> function, which accomplishes the same thing by
+calling <tt class="docutils literal"><span class="pre">exec</span></tt> on a string defining the class. This will be much
+easier to understand by the vast majority of the people reading your
+code: those who do not understand metaclasses.</p>
+</div>
+<div class="section" id="the-metaclass-hook">
+<h2>The Metaclass Hook<a class="headerlink" href="#the-metaclass-hook" title="Permalink to this headline">¶</a></h2>
+<p>So far, we&#8217;ve only used the <tt class="docutils literal"><span class="pre">type</span></tt> metaclass directly. Metaclass
+programming involves hooking our own operations into the creation of
+class objects. This is accomplished by:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Writing a subclass of the metaclass <tt class="docutils literal"><span class="pre">type</span></tt>.</li>
+<li>Inserting the new metaclass into the class creation process
+using the <em>metaclass hook</em>.</li>
+</ol>
+</blockquote>
+<p>In Python 2.x, the metaclass hook is a static field in the class
+called <tt class="docutils literal"><span class="pre">__metaclass__</span></tt>. In the ordinary case, this is not assigned
+so Python just uses <tt class="docutils literal"><span class="pre">type</span></tt> to create the class. But if you define
+<tt class="docutils literal"><span class="pre">__metaclass__</span></tt> to point to a callable that takes four arguments,
+Python will call <tt class="docutils literal"><span class="pre">__metaclass__()</span></tt> after the initial creation of the
+class object, passing in the class object, the class name, the list of
+base classes and the namespace dictionary.</p>
+<p>Thus, the basic process of metaclass programming looks like this:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/SimpleMeta1.py</span>
+<span class="c"># Two-step metaclass creation in Python 2.x</span>
+
+<span class="k">class</span> <span class="nc">SimpleMeta1</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">SimpleMeta1</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">uses_metaclass</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span> <span class="p">:</span> <span class="s">&quot;Yes!&quot;</span>
+
+<span class="k">class</span> <span class="nc">Simple1</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">SimpleMeta1</span>
+    <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">pass</span>
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">bar</span><span class="p">():</span> <span class="k">pass</span>
+
+<span class="n">simple</span> <span class="o">=</span> <span class="n">Simple1</span><span class="p">()</span>
+<span class="k">print</span><span class="p">([</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">simple</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">m</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;__&#39;</span><span class="p">)])</span>
+<span class="c"># A new method has been injected by the metaclass:</span>
+<span class="k">print</span> <span class="n">simple</span><span class="o">.</span><span class="n">uses_metaclass</span><span class="p">()</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">[&#39;bar&#39;, &#39;foo&#39;, &#39;uses_metaclass&#39;]</span>
+<span class="sd">Yes!</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>By convention, when defining metaclasses <tt class="docutils literal"><span class="pre">cls</span></tt> is used rather than
+<tt class="docutils literal"><span class="pre">self</span></tt> as the first argument to all methods except <tt class="docutils literal"><span class="pre">__new__()</span></tt>
+(which uses <tt class="docutils literal"><span class="pre">mcl</span></tt>, for reasons explained later). <tt class="docutils literal"><span class="pre">cls</span></tt>
+is the class object that is being modified.</p>
+<p>Note that the practice of calling the base-class constructor first (via
+<tt class="docutils literal"><span class="pre">super()</span></tt>) in the derived-class constructor should be followed with
+metaclasses as well.</p>
+<p><tt class="docutils literal"><span class="pre">__metaclass__</span></tt> only needs to be callable, so in Python
+2.x it&#8217;s possible to define <tt class="docutils literal"><span class="pre">__metaclass__</span></tt> inline:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/SimpleMeta2.py</span>
+<span class="c"># Combining the steps for metaclass creation in Python 2.x</span>
+
+<span class="k">class</span> <span class="nc">Simple2</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="k">class</span> <span class="nc">__metaclass__</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+        <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+            <span class="c"># This won&#39;t work:</span>
+            <span class="c"># super(__metaclass__, cls).__init__(name, bases, nmspc)</span>
+            <span class="c"># Less-flexible specific call:</span>
+            <span class="nb">type</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+            <span class="n">cls</span><span class="o">.</span><span class="n">uses_metaclass</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span> <span class="p">:</span> <span class="s">&quot;Yes!&quot;</span>
+
+<span class="k">class</span> <span class="nc">Simple3</span><span class="p">(</span><span class="n">Simple2</span><span class="p">):</span> <span class="k">pass</span>
+<span class="n">simple</span> <span class="o">=</span> <span class="n">Simple3</span><span class="p">()</span>
+<span class="k">print</span> <span class="n">simple</span><span class="o">.</span><span class="n">uses_metaclass</span><span class="p">()</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">Yes!</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>The compiler won&#8217;t accept the <tt class="docutils literal"><span class="pre">super()</span></tt> call because it says
+<tt class="docutils literal"><span class="pre">__metaclass__</span></tt> hasn&#8217;t been defined, forcing us to use the specific
+call to <tt class="docutils literal"><span class="pre">type.__init__()</span></tt>.</p>
+<p>Because it only needs to be callable, it&#8217;s even possible to define
+<tt class="docutils literal"><span class="pre">__metaclass__</span></tt> as a function:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/SimpleMeta3.py</span>
+<span class="c"># A function for __metaclass__ in Python 2.x</span>
+
+<span class="k">class</span> <span class="nc">Simple4</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__metaclass__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="n">cls</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">uses_metaclass</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span> <span class="p">:</span> <span class="s">&quot;Yes!&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span>
+
+<span class="n">simple</span> <span class="o">=</span> <span class="n">Simple4</span><span class="p">()</span>
+<span class="k">print</span> <span class="n">simple</span><span class="o">.</span><span class="n">uses_metaclass</span><span class="p">()</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">Yes!</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>As you&#8217;ll see, Python 3 doesn&#8217;t allow the syntax of these last two
+examples. Even so, the above example makes it quite clear what&#8217;s
+happening: the class object is created, then modified, then returned.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Or does it allow that syntax?</p>
+</div>
+<div class="section" id="the-metaclass-hook-in-python-3">
+<h3>The Metaclass Hook in Python 3<a class="headerlink" href="#the-metaclass-hook-in-python-3" title="Permalink to this headline">¶</a></h3>
+<p>Python 3 changes the metaclass hook. It doesn&#8217;t disallow the
+<tt class="docutils literal"><span class="pre">__metaclass__</span></tt> field, but it ignores it. Instead, you use a keyword
+argument in the base-class list:</p>
+<p>This means that none of the (clever) alternative ways of defining
+<tt class="docutils literal"><span class="pre">__metaclass__</span></tt> directly as a class or function are available in
+Python 3 [[check this]]. All metaclasses must be defined as separate
+classes. This is probably just as well, as it makes metaclass programs
+more consistent and thus easier to read and understand.</p>
+</div>
+</div>
+<div class="section" id="example-self-registration-of-subclasses">
+<h2>Example: Self-Registration of Subclasses<a class="headerlink" href="#example-self-registration-of-subclasses" title="Permalink to this headline">¶</a></h2>
+<p>It is sometimes convienient to use inheritance as an organizing
+mechanism &#8211; each sublclass becomes an element of a group that you
+work on. For example, in <strong>CodeManager.py</strong> in the <strong>Comprehensions</strong>
+chapter, the subclasses of <strong>Language</strong> were all the languages that
+needed to be processed. Each <strong>Language</strong> subclass described specific
+processing traits for that language.</p>
+<p>To solve this problem, consider a system that automatically keeps a
+list of all of it&#8217;s &#8220;leaf&#8221; subclasses (only the classes that have no
+inheritors). This way we can easily enumerate through all the
+subtypes:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/RegisterLeafClasses.py</span>
+
+<span class="k">class</span> <span class="nc">ClassSet</span><span class="p">(</span><span class="n">set</span><span class="p">):</span>
+    <span class="s">&quot;Simplify printing a set of classes&quot;</span>
+    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s">&quot;(&quot;</span> <span class="o">+</span> <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">c</span><span class="o">.</span><span class="n">__name__</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span> <span class="o">+</span> <span class="s">&quot;)&quot;</span>
+
+<span class="k">class</span> <span class="nc">RegisterLeafClasses</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">RegisterLeafClasses</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="s">&#39;registry&#39;</span><span class="p">):</span>
+            <span class="n">cls</span><span class="o">.</span><span class="n">registry</span> <span class="o">=</span> <span class="n">ClassSet</span><span class="p">()</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">registry</span> <span class="o">-=</span> <span class="n">set</span><span class="p">(</span><span class="n">bases</span><span class="p">)</span> <span class="c"># Remove base classes</span>
+
+<span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">RegisterLeafClasses</span>
+
+<span class="k">class</span> <span class="nc">Blue</span><span class="p">(</span><span class="n">Color</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Red</span><span class="p">(</span><span class="n">Color</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Green</span><span class="p">(</span><span class="n">Color</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Yellow</span><span class="p">(</span><span class="n">Color</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">print</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">registry</span><span class="p">)</span>
+<span class="k">class</span> <span class="nc">PhthaloBlue</span><span class="p">(</span><span class="n">Blue</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">CeruleanBlue</span><span class="p">(</span><span class="n">Blue</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">print</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">registry</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Shape</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">RegisterLeafClasses</span>
+
+<span class="k">class</span> <span class="nc">Round</span><span class="p">(</span><span class="n">Shape</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Square</span><span class="p">(</span><span class="n">Shape</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Triangular</span><span class="p">(</span><span class="n">Shape</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Boxy</span><span class="p">(</span><span class="n">Shape</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">print</span><span class="p">(</span><span class="n">Shape</span><span class="o">.</span><span class="n">registry</span><span class="p">)</span>
+<span class="k">class</span> <span class="nc">Circle</span><span class="p">(</span><span class="n">Round</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Ellipse</span><span class="p">(</span><span class="n">Round</span><span class="p">):</span> <span class="k">pass</span>
+<span class="k">print</span><span class="p">(</span><span class="n">Shape</span><span class="o">.</span><span class="n">registry</span><span class="p">)</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">(Red, Blue, Yellow, Green)</span>
+<span class="sd">(Red, CeruleanBlue, Yellow, PhthaloBlue, Green)</span>
+<span class="sd">(Square, Round, Boxy, Triangular)</span>
+<span class="sd">(Square, Ellipse, Boxy, Circle, Triangular)</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>Two separate tests are used to show that the registries are
+independent of each other. Each test shows what happens when another
+level of leaf classes are added &#8211; the former leaf becomes a base
+class, and so is removed from the registry.</p>
+<div class="section" id="using-class-decorators">
+<h3>Using Class Decorators<a class="headerlink" href="#using-class-decorators" title="Permalink to this headline">¶</a></h3>
+</div>
+<div class="section" id="using-the-inspect-module">
+<h3>Using the <strong>inspect</strong> module<a class="headerlink" href="#using-the-inspect-module" title="Permalink to this headline">¶</a></h3>
+<p>(As in the Comprehensions chapter)</p>
+</div>
+</div>
+<div class="section" id="example-making-a-class-final">
+<h2>Example: Making a Class &#8220;Final&#8221;<a class="headerlink" href="#example-making-a-class-final" title="Permalink to this headline">¶</a></h2>
+<p>It is sometimes convenient to prevent a class from being inherited:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/Final.py</span>
+<span class="c"># Emulating Java&#39;s &#39;final&#39;</span>
+
+<span class="k">class</span> <span class="nc">final</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">namespace</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">bases</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">final</span><span class="p">):</span>
+                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">klass</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; is final&quot;</span><span class="p">)</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">final</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">A</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="k">pass</span>
+
+<span class="k">class</span> <span class="nc">B</span><span class="p">(</span><span class="n">A</span><span class="p">):</span>
+    <span class="n">__metaclass__</span><span class="o">=</span> <span class="n">final</span>
+
+<span class="c"># Produces compile-time error:</span>
+<span class="k">class</span> <span class="nc">C</span><span class="p">(</span><span class="n">B</span><span class="p">):</span>
+    <span class="k">pass</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">...</span>
+<span class="sd">TypeError: B is final</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="using-init-vs-new-in-metaclasses">
+<h2>Using <tt class="docutils literal"><span class="pre">__init__</span></tt> vs. <tt class="docutils literal"><span class="pre">__new__</span></tt> in Metaclasses<a class="headerlink" href="#using-init-vs-new-in-metaclasses" title="Permalink to this headline">¶</a></h2>
+<p>It can be confusing when you see metaclass examples that appear to
+arbitrarily use <tt class="docutils literal"><span class="pre">__new__</span></tt> or <tt class="docutils literal"><span class="pre">__init__</span></tt> &#8211; why choose one over the other?</p>
+<p><tt class="docutils literal"><span class="pre">__new__</span></tt> is called for the creation of a new class, while
+<tt class="docutils literal"><span class="pre">__init__</span></tt> is called after the class is created, to perform
+additional initialization before the class is handed to the caller:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/NewVSInit.py</span>
+<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>
+
+<span class="k">class</span> <span class="nc">Tag1</span><span class="p">:</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Tag2</span><span class="p">:</span> <span class="k">pass</span>
+<span class="k">class</span> <span class="nc">Tag3</span><span class="p">:</span>
+    <span class="k">def</span> <span class="nf">tag3_method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">pass</span>
+
+<span class="k">class</span> <span class="nc">MetaBase</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">mcl</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;MetaBase.__new__</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">MetaBase</span><span class="p">,</span> <span class="n">mcl</span><span class="p">)</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">mcl</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;MetaBase.__init__</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">MetaBase</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">MetaNewVSInit</span><span class="p">(</span><span class="n">MetaBase</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">mcl</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="c"># First argument is the metaclass ``MetaNewVSInit``</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;MetaNewVSInit.__new__&#39;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">mcl</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span> <span class="n">pprint</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
+        <span class="c"># These all work because the class hasn&#39;t been created yet:</span>
+        <span class="k">if</span> <span class="s">&#39;foo&#39;</span> <span class="ow">in</span> <span class="n">nmspc</span><span class="p">:</span> <span class="n">nmspc</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;foo&#39;</span><span class="p">)</span>
+        <span class="n">name</span> <span class="o">+=</span> <span class="s">&#39;_x&#39;</span>
+        <span class="n">bases</span> <span class="o">+=</span> <span class="p">(</span><span class="n">Tag1</span><span class="p">,)</span>
+        <span class="n">nmspc</span><span class="p">[</span><span class="s">&#39;baz&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">42</span>
+        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">MetaNewVSInit</span><span class="p">,</span> <span class="n">mcl</span><span class="p">)</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">mcl</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span>
+        <span class="c"># First argument is the class being initialized</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;MetaNewVSInit.__init__&#39;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">):</span> <span class="n">pprint</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
+        <span class="k">if</span> <span class="s">&#39;bar&#39;</span> <span class="ow">in</span> <span class="n">nmspc</span><span class="p">:</span> <span class="n">nmspc</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;bar&#39;</span><span class="p">)</span> <span class="c"># No effect</span>
+        <span class="n">name</span> <span class="o">+=</span> <span class="s">&#39;_y&#39;</span> <span class="c"># No effect</span>
+        <span class="n">bases</span> <span class="o">+=</span> <span class="p">(</span><span class="n">Tag2</span><span class="p">,)</span> <span class="c"># No effect</span>
+        <span class="n">nmspc</span><span class="p">[</span><span class="s">&#39;pi&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">3.14159</span> <span class="c"># No effect</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">MetaNewVSInit</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">nmspc</span><span class="p">)</span>
+        <span class="c"># These do work because they operate on the class object:</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">__name__</span> <span class="o">+=</span> <span class="s">&#39;_z&#39;</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">__bases__</span> <span class="o">+=</span> <span class="p">(</span><span class="n">Tag3</span><span class="p">,)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">e</span> <span class="o">=</span> <span class="mf">2.718</span>
+
+<span class="k">class</span> <span class="nc">Test</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">MetaNewVSInit</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">&#39;Test.__init__&#39;</span><span class="p">)</span>
+    <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;foo still here&#39;</span><span class="p">)</span>
+    <span class="k">def</span> <span class="nf">bar</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;bar still here&#39;</span><span class="p">)</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">Test</span><span class="p">()</span>
+<span class="k">print</span><span class="p">(</span><span class="s">&#39;class name: &#39;</span> <span class="o">+</span> <span class="n">Test</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="s">&#39;base classes: &#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">__name__</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">Test</span><span class="o">.</span><span class="n">__bases__</span><span class="p">])</span>
+<span class="k">print</span><span class="p">([</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">m</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;__&quot;</span><span class="p">)])</span>
+<span class="n">t</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
+<span class="k">print</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">e</span><span class="p">)</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">MetaNewVSInit.__new__</span>
+<span class="sd">&lt;class &#39;__main__.MetaNewVSInit&#39;&gt;</span>
+<span class="sd">&#39;Test&#39;</span>
+<span class="sd">(&lt;type &#39;object&#39;&gt;,)</span>
+<span class="sd">{&#39;__init__&#39;: &lt;function __init__ at 0x7ecf0&gt;,</span>
+<span class="sd"> &#39;__metaclass__&#39;: &lt;class &#39;__main__.MetaNewVSInit&#39;&gt;,</span>
+<span class="sd"> &#39;__module__&#39;: &#39;__main__&#39;,</span>
+<span class="sd"> &#39;bar&#39;: &lt;function bar at 0x7ed70&gt;,</span>
+<span class="sd"> &#39;foo&#39;: &lt;function foo at 0x7ed30&gt;}</span>
+
+<span class="sd">MetaBase.__new__</span>
+
+<span class="sd">MetaNewVSInit.__init__</span>
+<span class="sd">&lt;class &#39;__main__.Test_x&#39;&gt;</span>
+<span class="sd">&#39;Test&#39;</span>
+<span class="sd">(&lt;type &#39;object&#39;&gt;,)</span>
+<span class="sd">{&#39;__init__&#39;: &lt;function __init__ at 0x7ecf0&gt;,</span>
+<span class="sd"> &#39;__metaclass__&#39;: &lt;class &#39;__main__.MetaNewVSInit&#39;&gt;,</span>
+<span class="sd"> &#39;__module__&#39;: &#39;__main__&#39;,</span>
+<span class="sd"> &#39;bar&#39;: &lt;function bar at 0x7ed70&gt;,</span>
+<span class="sd"> &#39;baz&#39;: 42}</span>
+
+<span class="sd">MetaBase.__init__</span>
+
+<span class="sd">Test.__init__</span>
+<span class="sd">class name: Test_x_z</span>
+<span class="sd">(&#39;base classes: &#39;, [&#39;object&#39;, &#39;Tag1&#39;, &#39;Tag3&#39;])</span>
+<span class="sd">[&#39;bar&#39;, &#39;baz&#39;, &#39;e&#39;, &#39;tag3_method&#39;]</span>
+<span class="sd">bar still here</span>
+<span class="sd">2.718</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>The primary difference is that when overriding <tt class="docutils literal"><span class="pre">__new__()</span></tt> you can change
+things like the &#8216;name&#8217;, &#8216;bases&#8217; and &#8216;namespace&#8217; arguments before you
+call the super constructor and it will have an effect, but doing the
+same thing in <tt class="docutils literal"><span class="pre">__init__()</span></tt> you won&#8217;t get any results from the constructor
+call.</p>
+<p>One special case in <tt class="docutils literal"><span class="pre">__new__()</span></tt> is that you can
+manipulate things like <tt class="docutils literal"><span class="pre">__slots__</span></tt>, but in <tt class="docutils literal"><span class="pre">__init__()</span></tt> you can&#8217;t.</p>
+<p>Note that, since the base-class version of <tt class="docutils literal"><span class="pre">__init__()</span></tt> doesn&#8217;t make any
+modifications, it makes sense to call it first, then perform any
+additional operations. In C++ and Java, the base-class constructor
+<em>must</em> be called as the first operation in a derived-class
+constructor, which makes sense because derived-class constructions can
+then build upon base-class foundations.</p>
+<p>In many cases, the choice of <tt class="docutils literal"><span class="pre">__new__()</span></tt> vs <tt class="docutils literal"><span class="pre">__init__()</span></tt> is a style issue and
+doesn&#8217;t matter, but because <tt class="docutils literal"><span class="pre">__new__()</span></tt> can do everything and <tt class="docutils literal"><span class="pre">__init__()</span></tt> is
+slightly more limited, some people just start using <tt class="docutils literal"><span class="pre">__new__()</span></tt> and stick with
+it. This use can be confusing &#8211; I tend to hunt for the reason that
+<tt class="docutils literal"><span class="pre">__init__()</span></tt> has been chosen, and if I can&#8217;t find it wonder whether
+the author knew what they were doing. I prefer to only use <tt class="docutils literal"><span class="pre">__new__()</span></tt>
+when it has meaning &#8211; when you must in order to change things that
+only <tt class="docutils literal"><span class="pre">__new__()</span></tt> can change.</p>
+</div>
+<div class="section" id="class-methods-and-metamethods">
+<h2>Class Methods and Metamethods<a class="headerlink" href="#class-methods-and-metamethods" title="Permalink to this headline">¶</a></h2>
+<p>A metamethod can be called from either the metaclass or from the
+class, but not from an instance. A classmethod can be called from
+either a class or its instances, but is not part of the metaclass.</p>
+<p>(Is a similar relationship true with attributes, or is it different?)</p>
+<div class="section" id="intercepting-class-creation">
+<h3>Intercepting Class Creation<a class="headerlink" href="#intercepting-class-creation" title="Permalink to this headline">¶</a></h3>
+<p>This example implements <em>Singleton</em> using metaclasses, by overriding the
+<tt class="docutils literal"><span class="pre">__call__()</span></tt> metamethod, which is invoked when a new instance is
+created:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Metaclasses/Singleton.py</span>
+
+<span class="k">class</span> <span class="nc">Singleton</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span>
+    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">cls</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
+             <span class="n">cls</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Singleton</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__call__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">instance</span>
+
+<span class="k">class</span> <span class="nc">ASingleton</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">Singleton</span>
+
+<span class="n">a</span> <span class="o">=</span> <span class="n">ASingleton</span><span class="p">()</span>
+<span class="n">b</span> <span class="o">=</span> <span class="n">ASingleton</span><span class="p">()</span>
+<span class="k">assert</span> <span class="n">a</span> <span class="ow">is</span> <span class="n">b</span>
+<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">BSingleton</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">Singleton</span>
+
+<span class="n">c</span> <span class="o">=</span> <span class="n">BSingleton</span><span class="p">()</span>
+<span class="n">d</span> <span class="o">=</span> <span class="n">BSingleton</span><span class="p">()</span>
+<span class="k">assert</span> <span class="n">c</span> <span class="ow">is</span> <span class="n">d</span>
+<span class="k">print</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
+<span class="k">assert</span> <span class="n">c</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">a</span>
+
+<span class="sd">&quot;&quot;&quot; Output:</span>
+<span class="sd">(&#39;ASingleton&#39;, &#39;ASingleton&#39;)</span>
+<span class="sd">(&#39;BSingleton&#39;, &#39;BSingleton&#39;)</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+</div>
+<p>By overriding <tt class="docutils literal"><span class="pre">__call__()</span></tt> in the metaclass, the creation of
+instances are intercepted. Instance creation is bypassed if one
+already exists.</p>
+<p>Note the dependence upon the behavior of static class fields. When
+<tt class="docutils literal"><span class="pre">cls.instance</span></tt> is first read, it gets the static value of
+<tt class="docutils literal"><span class="pre">instance</span></tt> from the metaclass, which is <tt class="xref docutils literal"><span class="pre">None</span></tt>. However, when the
+assignment is made, Python creates a local version for the particular
+class, and the next time <tt class="docutils literal"><span class="pre">cls.instance</span></tt> is read, it sees that local
+version. Because of this behavior, each class ends up with its own
+class-specific <tt class="docutils literal"><span class="pre">instance</span></tt> field (thus <tt class="docutils literal"><span class="pre">instance</span></tt> is not somehow
+being &#8220;inherited&#8221; from the metaclass).</p>
+</div>
+</div>
+<div class="section" id="metaclass-conflicts">
+<h2>Metaclass Conflicts<a class="headerlink" href="#metaclass-conflicts" title="Permalink to this headline">¶</a></h2>
+<p><a class="reference external" href="http://code.activestate.com/recipes/204197/">http://code.activestate.com/recipes/204197/</a></p>
+</div>
+<div class="section" id="further-reading">
+<h2>Further Reading<a class="headerlink" href="#further-reading" title="Permalink to this headline">¶</a></h2>
+<blockquote>
+<dl class="docutils">
+<dt>Excellent step-by-step introduction to metaclasses:</dt>
+<dd><a class="reference external" href="http://cleverdevil.org/computing/78/">http://cleverdevil.org/computing/78/</a></dd>
+<dt>Metaclass intro and comparison of syntax between Python 2.x and 3.x:</dt>
+<dd><a class="reference external" href="http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/">http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/</a></dd>
+<dt>David Mertz&#8217;s metaclass primer:</dt>
+<dd><a class="reference external" href="http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html">http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html</a></dd>
+<dt>Three-part in-depth coverage of metaclasses on IBM Developer Works. Quite useful and authoritative:</dt>
+<dd><ul class="first last simple">
+<li><a class="reference external" href="http://www.ibm.com/developerworks/linux/library/l-pymeta.html">http://www.ibm.com/developerworks/linux/library/l-pymeta.html</a></li>
+<li><a class="reference external" href="http://www.ibm.com/developerworks/linux/library/l-pymeta2/">http://www.ibm.com/developerworks/linux/library/l-pymeta2/</a></li>
+<li><a class="reference external" href="http://www.ibm.com/developerworks/linux/library/l-pymeta3.html">http://www.ibm.com/developerworks/linux/library/l-pymeta3.html</a></li>
+</ul>
+</dd>
+<dt>Michele Simionato&#8217;s articles on Artima, with special emphasis on the difference between Python 2.x and 3.x metaclasses:</dt>
+<dd><ul class="first last simple">
+<li><a class="reference external" href="http://www.artima.com/weblogs/viewpost.jsp?thread=236234">http://www.artima.com/weblogs/viewpost.jsp?thread=236234</a></li>
+<li><a class="reference external" href="http://www.artima.com/weblogs/viewpost.jsp?thread=236260">http://www.artima.com/weblogs/viewpost.jsp?thread=236260</a></li>
+</ul>
+</dd>
+</dl>
+<p>Once you understand the foundations, you can find lots of examples
+by searching for &#8220;metaclass&#8221; within the Python Cookbook:
+<a class="reference external" href="http://code.activestate.com/recipes/langs/python/">http://code.activestate.com/recipes/langs/python/</a></p>
+<p>The printed version of the Python Cookbook has far fewer examples
+than the online version, but the print version has been filtered
+and edited and so tends to be more authoritative.</p>
+<dl class="docutils">
+<dt>Ian Bicking writes about metaclasses:</dt>
+<dd><ul class="first last simple">
+<li><a class="reference external" href="http://blog.ianbicking.org/a-conservative-metaclass.html">http://blog.ianbicking.org/a-conservative-metaclass.html</a></li>
+<li><a class="reference external" href="http://blog.ianbicking.org/metaclass-fun.html">http://blog.ianbicking.org/metaclass-fun.html</a></li>
+<li><a class="reference external" href="http://blog.ianbicking.org/A-Declarative-Syntax-Extension.html">http://blog.ianbicking.org/A-Declarative-Syntax-Extension.html</a></li>
+<li><a class="reference external" href="http://blog.ianbicking.org/self-take-two.html">http://blog.ianbicking.org/self-take-two.html</a></li>
+</ul>
+</dd>
+</dl>
+<p>For more advanced study, the book <a class="reference external" href="http://www.pearsonhighered.com/educator/academic/product/0,,0201433052,00%2ben-USS_01DBC.html">Putting Metaclasses to Work</a>.</p>
+</blockquote>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <p class="logo"><a href="index.html">
+              <img class="logo" src="_static/cover.png" alt="Logo"/>
+            </a></p>
+    <font color="Red">This book is in early development; you will find parts that are incorrect &amp; incomplete.</font>
+    
+            <h3><a href="index.html">Table Of Contents</a></h3>
+            <ul>
+<li><a class="reference external" href="">Metaclasses</a><ul>
+<li><a class="reference external" href="#basic-metaclasses">Basic Metaclasses</a></li>
+<li><a class="reference external" href="#the-metaclass-hook">The Metaclass Hook</a><ul>
+<li><a class="reference external" href="#the-metaclass-hook-in-python-3">The Metaclass Hook in Python 3</a></li>
+</ul>
+</li>
+<li><a class="reference external" href="#example-self-registration-of-subclasses">Example: Self-Registration of Subclasses</a><ul>
+<li><a class="reference external" href="#using-class-decorators">Using Class Decorators</a></li>
+<li><a class="reference external" href="#using-the-inspect-module">Using the <strong>inspect</strong> module</a></li>
+</ul>
+</li>
+<li><a class="reference external" href="#example-making-a-class-final">Example: Making a Class &#8220;Final&#8221;</a></li>
+<li><a class="reference external" href="#using-init-vs-new-in-metaclasses">Using <tt class="docutils literal"><span class="pre">__init__</span></tt> vs. <tt class="docutils literal"><span class="pre">__new__</span></tt> in Metaclasses</a></li>
+<li><a class="reference external" href="#class-methods-and-metamethods">Class Methods and Metamethods</a><ul>
+<li><a class="reference external" href="#intercepting-class-creation">Intercepting Class Creation</a></li>
+</ul>
+</li>
+<li><a class="reference external" href="#metaclass-conflicts">Metaclass Conflicts</a></li>
+<li><a class="reference external" href="#further-reading">Further Reading</a></li>
+</ul>
+</li>
+</ul>
+
+
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="CoroutinesAndConcurrency.html"
+                                  title="previous chapter">Coroutines &amp; Concurrency</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="Jython.html"
+                                  title="next chapter">Jython</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/Metaclasses.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+    
+	  <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+	      <p style="font-size: 90%">Enter search terms or a module, class or function name.</p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+    <h4><a href="http://www.mindviewinc.com/Books/Python3Patterns/Index.php">Project Homepage</a></h4>
+    <h4><a href="http://www.bitbucket.org/BruceEckel/python-3-patterns-idioms/issues/">Corrections/Suggestions</a></h4>
+    <h4><a href="http://www.mindviewinc.com/Consulting/Index.php">Consulting &amp; Training</a></h4><br><br>
+
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="Jython.html" title="Jython"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="CoroutinesAndConcurrency.html" title="Coroutines & Concurrency"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">Python 3 Patterns, Recipes and Idioms</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, Creative Commons Attribution-Share Alike 3.0.
+      Last updated on Jan 22, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.
+    </div>
+  </body>
+</html>

html/_sources/Metaclasses.txt

+.. index::
+   Metaclasses
+   class decorators
+
+********************************************************************************
+Metaclasses
+********************************************************************************
+
+Objects are created by other objects: special objects called "classes"
+that we can set up to spit out objects that are configured to our
+liking. What creates these special "class" objects, though? Class
+objects are created by other special objects, called metaclasses.
+
+The default metaclass is called ``type`` and in the vast majority of
+cases it does the right thing. In some situations, however, you can
+gain leverage by modifying the way that classes are produced --
+typically by performing extra actions or injecting code. When this is
+the case, you can use *metaclass* programming to modify the way that
+some of your class objects are created.
+
+It's worth re-emphasizing that in *the vast majority of cases, you
+don't need metaclasses*, because it's a fascinating toy and the
+temptation to use it everywhere can be overwhelming. Some of the
+examples in this chapter will show both metaclass and non-metaclass
+solutions to a problem, so you can see that there's usually another
+(often simpler) approach.
+
+Some of the functionality that was previously only available with
+metaclasses is now available in a simpler form using class
+decorators. It is still useful, however, to understand metaclasses,
+and certain results can still be achieved only through metaclass
+programming.
+
+Basic Metaclasses
+================================================================================
+
+So metaclasses create classes, and classes create instances. Normally
+when we write a class, the default metaclass ``type`` is automatically
+invoked to create that class, and we aren't even aware that it's happening. 
+
+It's possible to explicitly code the metaclass' creation of a
+class. ``type`` called with one argument produces the type information
+of an existing class; ``type`` called with three arguments creates a
+new class object. The arguments when invoking ``type`` are the name of the class,
+a list of base classes, and a dictionary giving the namespace for the
+class (all the fields and methods). So the equivalent of::
+
+    class C: pass
+
+is::
+
+    C = type('C', (), {})
+
+Classes are often referred to as "types," so this reads fairly
+sensibly: you're calling a function that creates a new type based on
+its arguments.
+
+We can also add base classes, fields and methods::
+
+    # Metaclasses/MyList.py
+
+    def howdy(self, you):
+        print("Howdy, " + you)
+
+    MyList = type('MyList', (list,), dict(x=42, howdy=howdy))
+
+    ml = MyList()
+    ml.append("Camembert")
+    print(ml)
+    print(ml.x)
+    ml.howdy("John")
+
+    """ Output:
+    ['Camembert']
+    42
+    Howdy, John
+    """
+
+The ability to generate classes programmatically using ``type`` opens
+up some interesting possibilities. Consider the GreenHouseLanguage.py
+example in the Jython chapter -- all the subclasses in that case were
+written using repetetive code. We can automate the generation of the
+subclasses using ``type``::
+
+    # Metaclasses/GreenHouse.py
+
+    class Event(object):
+        events = [] # static
+
+        def __init__(self, action, time):
+            self.action = action
+            self.time = time
+            Event.events.append(self)
+
+        def __cmp__ (self, other):
+            "So sort() will compare only on time."
+            return cmp(self.time, other.time)
+
+        def run(self):
+            print("%.2f: %s" % (self.time, self.action))
+
+        @staticmethod
+        def run_events():
+            Event.events.sort();
+            for e in Event.events:
+                e.run()
+
+    def create_mc(description):
+        "Create subclass using the 'type' metaclass"
+        class_name = "".join(x.capitalize() for x in description.split())
+        def __init__(self, time):
+            Event.__init__(self, description + " [mc]", time)
+        globals()[class_name] = \
+            type(class_name, (Event,), dict(__init__ = __init__))
+
+    def create_exec(description):
+        "Create subclass by exec-ing a string"
+        class_name = "".join(x.capitalize() for x in description.split())
+        klass = """
+    class %s(Event):
+        def __init__(self, time):
+            Event.__init__(self, "%s [exec]", time)
+    """ % (class_name, description)
+        exec klass in globals()
+
+    if __name__ == "__main__":
+        descriptions = ["Light on", "Light off", "Water on", "Water off", 
+                        "Thermostat night", "Thermostat day", "Ring bell"]
+        initializations = "ThermostatNight(5.00); LightOff(2.00); \
+            WaterOn(3.30); WaterOff(4.45); LightOn(1.00); \
+            RingBell(7.00); ThermostatDay(6.00)"
+        [create_mc(dsc) for dsc in descriptions]
+        exec initializations in globals()
+        [create_exec(dsc) for dsc in descriptions]
+        exec initializations in globals()
+        Event.run_events()
+
+    """ Output:
+    1.00: Light on [mc]
+    1.00: Light on [exec]
+    2.00: Light off [mc]
+    2.00: Light off [exec]
+    3.30: Water on [mc]
+    3.30: Water on [exec]
+    4.45: Water off [mc]
+    4.45: Water off [exec]
+    5.00: Thermostat night [mc]
+    5.00: Thermostat night [exec]
+    6.00: Thermostat day [mc]
+    6.00: Thermostat day [exec]
+    7.00: Ring bell [mc]
+    7.00: Ring bell [exec]
+    """
+
+The ``Event`` base class is the same. The classes are created
+automatically using the ``create_mc()`` function, which takes its
+``description`` argument and generates a class name from it. Then it
+defines an ``__init__()`` method, which it puts into the namespace
+dictionary for the ``type`` call, producing a new subclass of
+``Event``. Note that the resulting class must be inserted into the
+global namespace, otherwise it will not be seen.
+
+This approach works fine, but then consider the subsequent
+``create_exec()`` function, which accomplishes the same thing by
+calling ``exec`` on a string defining the class. This will be much
+easier to understand by the vast majority of the people reading your
+code: those who do not understand metaclasses.
+
+The Metaclass Hook
+================================================================================
+
+So far, we've only used the ``type`` metaclass directly. Metaclass
+programming involves hooking our own operations into the creation of
+class objects. This is accomplished by:
+
+      1. Writing a subclass of the metaclass ``type``.
+      2. Inserting the new metaclass into the class creation process
+         using the *metaclass hook*.
+
+In Python 2.x, the metaclass hook is a static field in the class
+called ``__metaclass__``. In the ordinary case, this is not assigned
+so Python just uses ``type`` to create the class. But if you define
+``__metaclass__`` to point to a callable that takes four arguments,
+Python will call ``__metaclass__()`` after the initial creation of the
+class object, passing in the class object, the class name, the list of
+base classes and the namespace dictionary.
+
+Thus, the basic process of metaclass programming looks like this::
+
+    # Metaclasses/SimpleMeta1.py
+    # Two-step metaclass creation in Python 2.x
+
+    class SimpleMeta1(type):
+        def __init__(cls, name, bases, nmspc):
+            super(SimpleMeta1, cls).__init__(name, bases, nmspc)
+            cls.uses_metaclass = lambda self : "Yes!"
+
+    class Simple1(object):
+        __metaclass__ = SimpleMeta1
+        def foo(self): pass
+        @staticmethod
+        def bar(): pass
+
+    simple = Simple1()
+    print([m for m in dir(simple) if not m.startswith('__')])
+    # A new method has been injected by the metaclass:
+    print simple.uses_metaclass()
+
+    """ Output:
+    ['bar', 'foo', 'uses_metaclass']
+    Yes!
+    """
+
+By convention, when defining metaclasses ``cls`` is used rather than
+``self`` as the first argument to all methods except ``__new__()``
+(which uses ``mcl``, for reasons explained later). ``cls``
+is the class object that is being modified.
+
+Note that the practice of calling the base-class constructor first (via
+``super()``) in the derived-class constructor should be followed with
+metaclasses as well.
+
+``__metaclass__`` only needs to be callable, so in Python
+2.x it's possible to define ``__metaclass__`` inline::
+
+    # Metaclasses/SimpleMeta2.py
+    # Combining the steps for metaclass creation in Python 2.x
+
+    class Simple2(object):
+        class __metaclass__(type):
+            def __init__(cls, name, bases, nmspc):
+                # This won't work:
+                # super(__metaclass__, cls).__init__(name, bases, nmspc)
+                # Less-flexible specific call:
+                type.__init__(cls, name, bases, nmspc)
+                cls.uses_metaclass = lambda self : "Yes!"
+
+    class Simple3(Simple2): pass
+    simple = Simple3()
+    print simple.uses_metaclass()
+
+    """ Output:
+    Yes!
+    """
+
+The compiler won't accept the ``super()`` call because it says
+``__metaclass__`` hasn't been defined, forcing us to use the specific
+call to ``type.__init__()``. 
+
+Because it only needs to be callable, it's even possible to define
+``__metaclass__`` as a function::
+
+    # Metaclasses/SimpleMeta3.py
+    # A function for __metaclass__ in Python 2.x
+
+    class Simple4(object):
+        def __metaclass__(name, bases, nmspc):
+            cls = type(name, bases, nmspc)
+            cls.uses_metaclass = lambda self : "Yes!"
+            return cls
+
+    simple = Simple4()
+    print simple.uses_metaclass()
+
+    """ Output:
+    Yes!
+    """
+
+As you'll see, Python 3 doesn't allow the syntax of these last two
+examples. Even so, the above example makes it quite clear what's
+happening: the class object is created, then modified, then returned.
+
+.. Note:: Or does it allow that syntax?
+
+
+The Metaclass Hook in Python 3
+----------------------------------------------------------------------
+
+Python 3 changes the metaclass hook. It doesn't disallow the
+``__metaclass__`` field, but it ignores it. Instead, you use a keyword
+argument in the base-class list:
+
+This means that none of the (clever) alternative ways of defining
+``__metaclass__`` directly as a class or function are available in
+Python 3 [[check this]]. All metaclasses must be defined as separate
+classes. This is probably just as well, as it makes metaclass programs
+more consistent and thus easier to read and understand.
+
+
+
+
+.. Possible example: simplification of XML creation via operator
+   overloading.
+
+
+Example: Self-Registration of Subclasses
+================================================================================
+
+It is sometimes convienient to use inheritance as an organizing
+mechanism -- each sublclass becomes an element of a group that you
+work on. For example, in **CodeManager.py** in the **Comprehensions**
+chapter, the subclasses of **Language** were all the languages that
+needed to be processed. Each **Language** subclass described specific
+processing traits for that language.
+
+To solve this problem, consider a system that automatically keeps a
+list of all of it's "leaf" subclasses (only the classes that have no
+inheritors). This way we can easily enumerate through all the
+subtypes::
+
+    # Metaclasses/RegisterLeafClasses.py
+
+    class ClassSet(set):
+        "Simplify printing a set of classes"
+        def __str__(self):
+            return "(" + ", ".join([c.__name__ for c in self]) + ")"
+
+    class RegisterLeafClasses(type):
+        def __init__(cls, name, bases, nmspc):
+            super(RegisterLeafClasses, cls).__init__(name, bases, nmspc)
+            if not hasattr(cls, 'registry'):
+                cls.registry = ClassSet()
+            cls.registry.add(cls)
+            cls.registry -= set(bases) # Remove base classes
+
+    class Color(object):
+        __metaclass__ = RegisterLeafClasses
+
+    class Blue(Color): pass
+    class Red(Color): pass
+    class Green(Color): pass
+    class Yellow(Color): pass
+    print(Color.registry)
+    class PhthaloBlue(Blue): pass
+    class CeruleanBlue(Blue): pass
+    print(Color.registry)
+
+    class Shape(object):
+        __metaclass__ = RegisterLeafClasses
+
+    class Round(Shape): pass
+    class Square(Shape): pass
+    class Triangular(Shape): pass
+    class Boxy(Shape): pass
+    print(Shape.registry)
+    class Circle(Round): pass
+    class Ellipse(Round): pass
+    print(Shape.registry)
+
+    """ Output:
+    (Red, Blue, Yellow, Green)
+    (Red, CeruleanBlue, Yellow, PhthaloBlue, Green)
+    (Square, Round, Boxy, Triangular)
+    (Square, Ellipse, Boxy, Circle, Triangular)
+    """
+
+Two separate tests are used to show that the registries are
+independent of each other. Each test shows what happens when another
+level of leaf classes are added -- the former leaf becomes a base
+class, and so is removed from the registry.
+
+Using Class Decorators
+--------------------------------------------------------------------------------
+
+Using the **inspect** module
+--------------------------------------------------------------------------------
+
+(As in the Comprehensions chapter)
+
+Example: Making a Class "Final"
+================================================================================
+
+It is sometimes convenient to prevent a class from being inherited::
+
+    # Metaclasses/Final.py
+    # Emulating Java's 'final'
+
+    class final(type):
+        def __init__(cls, name, bases, namespace):
+            for klass in bases:
+                if isinstance(klass, final):
+                    raise TypeError(str(klass.__name__) + " is final")
+            super(final, cls).__init__(name, bases, namespace)
+
+    class A(object):
+        pass
+
+    class B(A):
+        __metaclass__= final
+
+    # Produces compile-time error:
+    class C(B):
+        pass
+
+    """ Output:
+    ...
+    TypeError: B is final
+    """
+
+.. can this be done with decorators?
+
+
+Using ``__init__`` vs. ``__new__`` in Metaclasses
+================================================================================
+
+It can be confusing when you see metaclass examples that appear to
+arbitrarily use ``__new__`` or ``__init__`` -- why choose one over the other?
+
+``__new__`` is called for the creation of a new class, while
+``__init__`` is called after the class is created, to perform
+additional initialization before the class is handed to the caller::
+
+    # Metaclasses/NewVSInit.py
+    from pprint import pprint
+
+    class Tag1: pass
+    class Tag2: pass
+    class Tag3:
+        def tag3_method(self): pass
+
+    class MetaBase(type):
+        def __new__(mcl, name, bases, nmspc):
+            print('MetaBase.__new__\n')
+            return super(MetaBase, mcl).__new__(mcl, name, bases, nmspc)
+
+        def __init__(cls, name, bases, nmspc):
+            print('MetaBase.__init__\n')
+            super(MetaBase, cls).__init__(name, bases, nmspc)
+
+    class MetaNewVSInit(MetaBase):
+        def __new__(mcl, name, bases, nmspc):
+            # First argument is the metaclass ``MetaNewVSInit``
+            print('MetaNewVSInit.__new__')
+            for x in (mcl, name, bases, nmspc): pprint(x)
+            print('')
+            # These all work because the class hasn't been created yet:
+            if 'foo' in nmspc: nmspc.pop('foo')
+            name += '_x'
+            bases += (Tag1,)
+            nmspc['baz'] = 42
+            return super(MetaNewVSInit, mcl).__new__(mcl, name, bases, nmspc)
+
+        def __init__(cls, name, bases, nmspc):
+            # First argument is the class being initialized
+            print('MetaNewVSInit.__init__')
+            for x in (cls, name, bases, nmspc): pprint(x)
+            print('')
+            if 'bar' in nmspc: nmspc.pop('bar') # No effect
+            name += '_y' # No effect
+            bases += (Tag2,) # No effect
+            nmspc['pi'] = 3.14159 # No effect
+            super(MetaNewVSInit, cls).__init__(name, bases, nmspc)
+            # These do work because they operate on the class object:
+            cls.__name__ += '_z'
+            cls.__bases__ += (Tag3,)
+            cls.e = 2.718
+
+    class Test(object):
+        __metaclass__ = MetaNewVSInit
+        def __init__(self):
+            print('Test.__init__')
+        def foo(self): print('foo still here')
+        def bar(self): print('bar still here')
+
+    t = Test()
+    print('class name: ' + Test.__name__)
+    print('base classes: ', [c.__name__ for c in Test.__bases__])
+    print([m for m in dir(t) if not m.startswith("__")])
+    t.bar()
+    print(t.e)
+
+    """ Output:
+    MetaNewVSInit.__new__
+    <class '__main__.MetaNewVSInit'>
+    'Test'
+    (<type 'object'>,)
+    {'__init__': <function __init__ at 0x7ecf0>,
+     '__metaclass__': <class '__main__.MetaNewVSInit'>,
+     '__module__': '__main__',
+     'bar': <function bar at 0x7ed70>,
+     'foo': <function foo at 0x7ed30>}
+
+    MetaBase.__new__
+
+    MetaNewVSInit.__init__
+    <class '__main__.Test_x'>
+    'Test'
+    (<type 'object'>,)
+    {'__init__': <function __init__ at 0x7ecf0>,
+     '__metaclass__': <class '__main__.MetaNewVSInit'>,
+     '__module__': '__main__',
+     'bar': <function bar at 0x7ed70>,
+     'baz': 42}
+
+    MetaBase.__init__
+
+    Test.__init__
+    class name: Test_x_z
+    ('base classes: ', ['object', 'Tag1', 'Tag3'])
+    ['bar', 'baz', 'e', 'tag3_method']
+    bar still here
+    2.718
+    """
+
+
+The primary difference is that when overriding ``__new__()`` you can change
+things like the 'name', 'bases' and 'namespace' arguments before you
+call the super constructor and it will have an effect, but doing the
+same thing in ``__init__()`` you won't get any results from the constructor
+call.
+
+One special case in ``__new__()`` is that you can
+manipulate things like ``__slots__``, but in ``__init__()`` you can't.
+
+Note that, since the base-class version of ``__init__()`` doesn't make any
+modifications, it makes sense to call it first, then perform any
+additional operations. In C++ and Java, the base-class constructor
+*must* be called as the first operation in a derived-class
+constructor, which makes sense because derived-class constructions can
+then build upon base-class foundations.
+
+In many cases, the choice of ``__new__()`` vs ``__init__()`` is a style issue and
+doesn't matter, but because ``__new__()`` can do everything and ``__init__()`` is
+slightly more limited, some people just start using ``__new__()`` and stick with
+it. This use can be confusing -- I tend to hunt for the reason that
+``__init__()`` has been chosen, and if I can't find it wonder whether
+the author knew what they were doing. I prefer to only use ``__new__()``
+when it has meaning -- when you must in order to change things that
+only ``__new__()`` can change. 
+
+Class Methods and Metamethods
+================================================================================
+
+A metamethod can be called from either the metaclass or from the
+class, but not from an instance. A classmethod can be called from
+either a class or its instances, but is not part of the metaclass.
+
+(Is a similar relationship true with attributes, or is it different?)
+
+Intercepting Class Creation
+--------------------------------------------------------------------------------
+
+This example implements *Singleton* using metaclasses, by overriding the
+``__call__()`` metamethod, which is invoked when a new instance is
+created::
+
+    # Metaclasses/Singleton.py
+
+    class Singleton(type):
+        instance = None
+        def __call__(cls, *args, **kw):
+            if not cls.instance:
+                 cls.instance = super(Singleton, cls).__call__(*args, **kw)
+            return cls.instance
+
+    class ASingleton(object):
+        __metaclass__ = Singleton
+
+    a = ASingleton()
+    b = ASingleton()
+    assert a is b
+    print(a.__class__.__name__, b.__class__.__name__)
+
+    class BSingleton(object):
+        __metaclass__ = Singleton
+
+    c = BSingleton()
+    d = BSingleton()
+    assert c is d
+    print(c.__class__.__name__, d.__class__.__name__)
+    assert c is not a
+
+    """ Output:
+    ('ASingleton', 'ASingleton')
+    ('BSingleton', 'BSingleton')
+    """
+
+By overriding ``__call__()`` in the metaclass, the creation of
+instances are intercepted. Instance creation is bypassed if one
+already exists.
+
+Note the dependence upon the behavior of static class fields. When
+``cls.instance`` is first read, it gets the static value of
+``instance`` from the metaclass, which is ``None``. However, when the
+assignment is made, Python creates a local version for the particular
+class, and the next time ``cls.instance`` is read, it sees that local
+version. Because of this behavior, each class ends up with its own
+class-specific ``instance`` field (thus ``instance`` is not somehow
+being "inherited" from the metaclass).
+
+.. class decorator version that modifies __new__().
+
+Metaclass Conflicts
+================================================================================
+
+http://code.activestate.com/recipes/204197/
+
+Further Reading
+================================================================================
+
+    Excellent step-by-step introduction to metaclasses:
+        http://cleverdevil.org/computing/78/
+
+    Metaclass intro and comparison of syntax between Python 2.x and 3.x:
+        http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/
+
+    David Mertz's metaclass primer:
+        http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html
+
+    Three-part in-depth coverage of metaclasses on IBM Developer Works. Quite useful and authoritative:
+      - http://www.ibm.com/developerworks/linux/library/l-pymeta.html
+      - http://www.ibm.com/developerworks/linux/library/l-pymeta2/
+      - http://www.ibm.com/developerworks/linux/library/l-pymeta3.html
+
+    Michele Simionato's articles on Artima, with special emphasis on the difference between Python 2.x and 3.x metaclasses:
+      - http://www.artima.com/weblogs/viewpost.jsp?thread=236234
+      - http://www.artima.com/weblogs/viewpost.jsp?thread=236260
+
+    Once you understand the foundations, you can find lots of examples
+    by searching for "metaclass" within the Python Cookbook:
+    http://code.activestate.com/recipes/langs/python/
+
+    The printed version of the Python Cookbook has far fewer examples
+    than the online version, but the print version has been filtered
+    and edited and so tends to be more authoritative.
+
+    Ian Bicking writes about metaclasses:
+      - http://blog.ianbicking.org/a-conservative-metaclass.html
+      - http://blog.ianbicking.org/metaclass-fun.html
+      - http://blog.ianbicking.org/A-Declarative-Syntax-Extension.html
+      - http://blog.ianbicking.org/self-take-two.html
+
+    For more advanced study, the book `Putting Metaclasses to Work
+    <http://www.pearsonhighered.com/educator/academic/product/0,,0201433052,00%2ben-USS_01DBC.html>`_.
+

html/genindex.html

   <dd><dl>
     <dt><a href="CanonicalScript.html#index-0">script command-line</a></dt>
   </dl></dd>
-<dt><a href="Metaclasses.html#index-24">class decorators</a></dt>
+<dt><a href="Metaclasses.html#index-29">class decorators</a></dt>
 <dt>command-line</dt>
   <dd><dl>
     <dt><a href="CanonicalScript.html#index-0">canonical form, script</a></dt>
 <dl>
 
 <dt><a href="Messenger.html#index-10">messenger (data transfer object)</a></dt>
-<dt><a href="Metaclasses.html#index-24">Metaclasses</a></dt></dl></td><td width="33%" valign="top"><dl>
+<dt><a href="Metaclasses.html#index-29">Metaclasses</a></dt></dl></td><td width="33%" valign="top"><dl>
 <dt><a href="CoroutinesAndConcurrency.html#index-3">multiprocessing</a></dt>
 </dl></td></tr></table>
 
 <li class="toctree-l3"><a class="reference external" href="Metaclasses.html#using-the-inspect-module">Using the <strong>inspect</strong> module</a></li>
 </ul>
 </li>
+<li class="toctree-l2"><a class="reference external" href="Metaclasses.html#example-making-a-class-final">Example: Making a Class &#8220;Final&#8221;</a></li>
 <li class="toctree-l2"><a class="reference external" href="Metaclasses.html#using-init-vs-new-in-metaclasses">Using <tt class="docutils literal"><span class="pre">__init__</span></tt> vs. <tt class="docutils literal"><span class="pre">__new__</span></tt> in Metaclasses</a></li>
 <li class="toctree-l2"><a class="reference external" href="Metaclasses.html#class-methods-and-metamethods">Class Methods and Metamethods</a><ul>
 <li class="toctree-l3"><a class="reference external" href="Metaclasses.html#intercepting-class-creation">Intercepting Class Creation</a></li>
 </ul>
 </li>
+<li class="toctree-l2"><a class="reference external" href="Metaclasses.html#metaclass-conflicts">Metaclass Conflicts</a></li>
 <li class="toctree-l2"><a class="reference external" href="Metaclasses.html#further-reading">Further Reading</a></li>
 </ul>
 </li>

html/searchindex.js

-Search.setIndex({desctypes:{},terms:{defaultcloseoper:10,orthogon:21,yellow:[29,18],four:[13,18,12,36],secondli:20,prefix:29,sleep:[36,29],dirnam:[1,6],"00798f9c":22,browse_thread:7,gladiolu:32,evalscissor:23,whose:[16,28,11,23,29],authorit:18,pprint:18,selen:7,concret:[28,1,4],swap:[35,29],under:[21,10,11,1,12,2,16,35,7],testabl:1,worth:[28,10,4,18],lure:12,everi:[21,33,10,1,12,2,4,16,28,29,8,20],risk:30,inventfeatur:32,matchobj:6,rise:21,lurk:10,voic:[2,13,1],decorator_without_argu:8,govern:12,affect:[28,29],vast:18,disturb:[28,4],nestedshapefactori:4,ref:7,decorator_with_argu:8,previou:[28,12,2,4,8,20],correct:[10,28,12],"__templatemethod":0,getdeclaredmethod:1,math:[10,28,29],verif:1,unpredictableperson:12,cappuccinowhip:20,c02:1,cmp:[18,12],storag:22,"10f":28,direct:[21,9,10,12,4,8,36],sourceforg:[10,29],nail:28,hors:33,classcastexcept:16,"__finditem__":10,even:[10,11,1,13,28,33,19,35,18,7,22,8,20],hide:[21,28,37],createshap:4,canvasheight:36,item1:23,weren:22,shallowai:11,firstdigit:12,"new":[0,1,2,3,4,6,7,14,10,11,12,13,15,16,18,20,21,23,28,32,33,36],net:[10,1,29,2,13,7],ever:[16,28,23],succumb:1,liberti:37,told:4,getsiz:29,widget:29,abov:[21,10,11,1,29,2,8,15,4,33,13,35,18,32,7,22,28,14,20],never:[2,28,10,22,1],here:[1,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21,28,23,22,29,31,33,36,37],fun:[8,18],debugg:7,gridlayout:29,path:[28,1,12,10,6,7,29],cardboard:28,interpret:[21,9,10,11,28],dry:20,sweeet:7,haschang:[29,12],credit:[13,9],loop:[21,28,0,10,4,33],studi:[21,28,1,29,4,18],readlinesetup:10,portabl:[10,4],tremend:10,golden:21,propag:[21,28,29],"_test":6,brought:[7,33,10],substr:28,unix:31,ratsandmaz:36,wateron:[10,18],total:[10,28,12],unit:[9,10,1],getchar:10,plot:29,redon:13,describ:[21,33,10,1,12,2,32,28,16,35,5,18,7,20],would:[33,10,0,1,12,2,29,4,16,28,11,17,22,8,20],quickpython:33,call:[21,9,10,0,1,12,33,32,29,4,23,16,28,11,6,18,7,22,37,8,35],typo:13,recommend:28,type:[21,9,10,11,1,12,33,32,29,4,23,16,28,18,7,22,37,20],until:[21,10,11,12,32,28,33,6,19,8],looni:11,relat:[21,35],notic:[28,1,29,32,23,10,33,4,8],hurt:29,warn:[21,10,14,28],glass:28,loss:20,flowervisitor:32,moin:8,hole:1,hold:[10,11,12,13,28,16],unpack:[10,28],must:[10,11,1,12,2,32,29,4,23,33,28,5,36,18,7,22,37,8,20],join:[10,6,18],sometim:[21,10,0,37,13,28,18,7,8],err:[28,1],setup:[7,1,4],work:[21,9,10,28,1,29,33,2,8,4,23,16,13,35,6,18,7,22,14,20,19],worm:32,introduc:[21,10,1,2,28,13],root:[28,1],overrid:[28,0,1,12,33,18,7,29],walk_comprehens:10,give:[21,10,1,31,2,28,33,13,18,7,8,36],digit:12,indic:[9,10,30,12,28,4,33,29,8],setvis:[10,36,29],unavail:12,unassign:7,keep:[21,10,28,1,12,2,4,13,35,5,18,7,29],addtobin:28,end:[21,10,11,29,2,28,23,33,13,14,36],quot:33,ordinari:[28,1,29,10,4,18],classifi:[21,9],revisit:[28,4],how:[21,33,10,11,1,29,2,32,15,4,23,16,13,7,22,28,20],hot:20,disappear:[19,36],env:1,regist:[7,29],answer:[7,28,1,23],verifi:[10,1],changeinterfac:37,perspect:[21,28],"void":[10,1],updat:[30,29,6,7,14,36],my_new:22,recogn:[],lai:1,mess:2,coffeeshop:20,after:[21,10,11,1,12,8,28,33,36,18,7,22,14,20],implementation1:35,lump:35,implementation2:35,diagram:[9,28,12,13,35,7,14,20],befor:[21,33,10,11,1,12,2,28,16,18,29,8,20],wrong:[28,10,1],beauti:[28,35],law:21,parallel:[21,3],demonstr:[10,0,1,29,12,32,23,33,35],beanmeup:20,chere:7,profess:17,attempt:[21,28,1],third:28,classmethod:[22,18],revolv:21,exclud:1,wink:0,maintain:[21,28,11,12,13,23,36,8,20],environ:[7,32,28,4,31],incorpor:[10,11,8,1],enter:[10,8,29,12,36],lambda:[10,18],someplac:7,order:[33,10,0,29,12,2,4,16,28,11,5,18,7,14,20,35],origin:[10,1,29,14,28,16,36,8,20],composit:21,softwar:[7,1],over:[21,33,10,11,1,2,28,16,18,8],failur:[21,11,1],orang:29,becaus:[21,33,10,1,12,2,32,29,28,16,13,35,18,7,22,37,8,19],paperscissorsrock:[32,23],flexibl:[21,9,10,11,12,28,23,33,18,38,20],vari:[21,11],fit:[21,28,11,1,29,2,35],fix:[28,29,30,13,32,22,7,14,20],avocado:20,"__class__":[32,10,11,23,20],bytecod:10,better:[21,10,11,1,12,2,28,13,29,8],imp:[16,35],blemang:33,comprehens:[9,10,6,18],hidden:[33,28,0,35],schmidt:28,easier:[21,10,1,12,32,5,18,7,29,8],glassbin:28,them:[21,33,10,11,1,29,2,32,28,23,16,13,36,6,7,8,20,17],thei:[21,33,10,11,1,12,2,32,29,28,16,13,6,18,22,37,8,20],proce:7,safe:[16,9,10,8],stringformat:33,"break":[28,1,30,20,36,6],promis:28,setvalu:28,"instanceof":28,choic:[28,11,29,2,32,4,23,13,36,18,7,20],grammat:2,alex:22,brough:[],getvalu:[10,28,12],closeobserv:29,each:[21,9,10,0,1,12,32,29,4,23,33,28,11,36,6,18,22,14,20,35],debug:[10,14,30],side:[7,13,10,28,1],mean:[21,33,10,11,1,12,13,32,28,16,35,18,29,8,20],prohibit:28,setdefaultcloseoper:[10,29],nochang:12,enorm:8,arduou:20,taught:11,makecharact:4,receptacl:28,collector:10,whip:20,goe:[13,33,28,20],langug:10,gof:[21,11,35],content:28,rewrit:[10,2,8,28,16,13,35,37,7,14,20],dsl:10,vector:[21,28,36,12],adapt:[7,9,28,37],reader:[9,1,13,16,33,5,19],got:[13,1,37],washer:12,forth:10,dsc:18,linear:21,barrier:21,situat:[28,1,10,33,18,22],free:[7,13,21,12],standard:[21,10,11,1,29,33,8],ncpu:31,println:[28,10,1],mousemovegener:12,quickinstal:7,"__subclasses__":[32,4,23],kit:10,acrobat:7,uiuc:28,puzzl:4,angl:21,openssh:7,filter:18,mvc:29,isn:[21,10,0,29,2,28,33,35],subtl:[21,28],onto:21,bite:1,rang:[10,0,29,32,4,23,33],perfectli:12,gradi:28,setlayout:29,hoop:8,independ:[21,28,29,18],wast:[33,4,29],restrict:[2,10,8,22,29],"__tojava__":10,unlik:[33,28,11,1],alreadi:[21,10,11,1,29,2,28,16,18,7,36],messag:[21,10,12,1,29,33,7],wasn:28,getmemb:6,thick:4,agre:33,primari:[28,11,1,3,18,32],hood:10,brillig:10,vendingmachinetest:12,rewritten:[13,19],"__implement":35,spinach:20,top:20,evolut:[21,28],stack:29,rsrc:29,exponenti:[21,20],necessarili:[13,0],master:[10,28,12],too:[21,10,1,13,28,34,19,8,20],similarli:10,john:18,ndiff:6,consol:[10,1],namespac:18,tool:[9,10,11,1,12,2,4,13,7,29,28,14],lower:21,getcontentpan:29,somewhat:2,conserv:18,technic:13,trek:22,silli:28,target:[10,29],keyword:[33,29,10,4,18],provid:[21,33,10,0,1,12,29,4,16,28,11,37,7,22,8,20,35],"__onlyon":22,tree:[10,1],second:[33,10,11,29,28,23,16,35,22,8],"final":[21,10,0,1,29,2,32,28,13,36,7,8,20],project:[21,9,10,1,2,32,28,13,17,7,14,36],matter:[21,28,11,13,4,18],shapefactori:4,foamedmilk:20,fashion:[33,28,8],mind:[13,22,1,6],mine:7,raw:33,aforement:21,"__main__":[22,1,29,10,33,6,18],seen:[21,33,10,11,29,12,2,4,16,35,18,8],seem:[21,10,1,12,14,4,33,28,35,8],seek:[28,12],seminar:2,innerclass:10,realm:[16,21],respectjavaaccess:10,terrif:10,person:[7,10],latter:[21,10],especi:[21,28,30,10,33,17],thorough:10,alreadyopen:29,staticinnerclass:10,client:[28,0,1,12,2,35,37],alldecor:20,thoroughli:2,wherebi:12,simplifi:[7,22,10,4,18],shall:[10,11,1],bruce:7,glob:[10,1],object:[1,4,5,8,9,10,11,12,14,16,18,36,21,22,23,28,29,32,33,35,20,37],what:[1,2,3,4,6,7,8,9,10,11,12,13,16,18,19,20,21,28,22,29,33,35,37],messeng:[9,28,11,12,5,6],regular:[33,10,1,20],letter:0,phase:[21,28,8],coin:11,sub:6,tradit:21,simplic:[21,32,10,12,33],don:[21,9,10,28,37,29,2,3,4,23,33,13,34,35,18,7,8,19],simplif:[10,18],pythoninterpreterset:10,doc:7,flow:[13,10],doe:[21,10,11,1,12,8,29,4,33,28,0,18,22,14,30,35],bash_profil:7,dummi:11,declar:[33,1,18],wildcard:10,itemslot:12,notion:35,dot:10,marvel:33,has_kei:[28,4,12,31],class_nam:18,endear:10,visitor:[21,9,28,1,29,32],"__str__":[22,11,12,32,23,18],random:[21,28,29,32,4,23],particip:7,syntax:[10,1,28,33,5,18,22,8],"2008v1":7,involv:[21,28,15,22,16,18,7],despit:28,layout:[2,13,10],acquir:29,menu:[7,15,4,20],explain:[35,8,1,18,4],configur:[9,10,29,12,13,28,23,18,7,38],restaur:20,sugar:8,theme:11,busi:32,"__call__":[22,11,8,18],python3pattern:[7,14],oct:10,edict:32,cappuccino:20,vener:7,stop:[28,1],on_mouseup:29,report:[7,1,36],rosettacod:11,bat:10,bar:[13,3,22,18],isopen:29,emb:[33,10],baz:[3,18],choru:35,"public":[21,10,1,2,28,13],twice:[1,29],bad:[13,4],steam:20,black:[9,1,29],fair:11,decoratortalk:8,elimin:[10,28],mandatori:21,result:[21,33,10,11,1,29,28,16,6,18,8,20,36],respons:[9,28,0,12,33,11,36,20],fail:[28,10,8,1,12],hash:[16,33,12],charact:[10,4],hammer:28,best:[21,10,2,33,13,7,8],brazil:2,awar:[28,10,29,4,18],said:2,alsum:28,databas:22,hgrc:7,red3d:36,discoveri:[21,28],figur:[2,13,10,28,31],emptor:19,simplest:[21,22,10,1,29],awai:[21,28,20,12],getkei:10,approach:[21,9,10,29,12,32,4,16,28,18,7,22,37,8,20],attribut:[21,10,2,5,18,8],accord:[16,28,1],extend:[16,32,28,1,4],xrang:10,weak:33,extens:[7,13,10,28,18],lazi:[22,35,12],preprocessor:8,backgroundcolor:29,rtti:[9,28],aparat:28,protect:[10,35,1,29],accident:[21,28],expos:[28,37],howev:[21,33,10,11,1,12,13,32,29,4,16,28,35,5,36,18,7,22,37,8,20],pitt:8,against:[32,10,8,28],sketch:13,logic:[21,29,20],countri:11,com:[21,10,1,12,13,28,16,18,7,8,36],con:20,compromis:[9,20],kwd:22,notifyobserv:29,elf:32,trunk:[7,9,10],sai:[21,33,10,0,29,12,13,32,28,23,16,11,6,18,7,8],"2nd":10,diff:7,guid:[7,9],assum:[7,33,28,22],duplic:[21,6],light:[10,18],testsynchron:29,ianbick:18,three:[21,10,12,32,18,8,20],been:[21,10,29,12,2,28,33,13,35,18,19,22,8],chrysanthemum:32,much:[21,10,28,1,29,2,3,4,33,13,18,32,7,8,19],interest:[21,10,1,29,2,28,18,22,8],basic:[21,9,10,1,12,2,4,33,16,28,35,18,29,37,8,20],"__doc__":6,"__len__":10,quickli:[10,12],life:29,mcl:18,deeper:[28,10,4],spit:18,getval:10,xxx:31,isfunct:6,dave:16,alreadyclos:29,bookstor:2,ugli:[28,37],exception:[33,10],ident:[28,37,22,12],occam:21,gnu:1,servic:[2,13],properti:10,commerci:[13,10],air:[4,12],employ:2,calcul:[11,29],aid:33,vagu:21,dizzi:21,enlev:21,seconddigit:12,player:29,kwarg:[5,6],tediou:[10,29],sever:[28,10,4,12],valgen:10,quand:21,perform:[21,10,11,1,12,32,4,23,28,0,18,29,8,20],suggest:[21,28,1,13,22,33,7],make:[1,2,4,5,6,7,8,9,10,11,12,13,14,17,18,20,21,28,23,22,30,29,32,33,35],format:[2,7,33,13],who:[28,29,30,2,13,17,18,7,14],complex:[9,10,11,1,29,4,6,8],descend:1,complet:[21,10,1,12,28,35,7,29,8,36],inheritor:[29,18],blue:[29,18],listperform:38,hand:[21,33,28,11,29,13,4,16,18,22,8],fairli:[21,28,1,29,10,23,18],nix:10,rais:[2,28,12],garlic:20,refin:[10,14,28],techniqu:[28,3,22,4,16,32],qualif:10,jframe:[10,29],kept:[2,1],thu:[21,33,10,11,1,12,4,23,16,28,0,18,8,20],getbyt:36,pymeta3:18,inherit:[21,9,10,11,1,12,29,4,33,28,0,18,22,20],runtimeexcept:[16,12],academia:11,shortli:[33,1],greatest:[21,28],thi:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,18,19,20,21,22,23,28,29,30,32,33,34,35,36,37],programm:[21,9,10,0,1,12,2,22,33,35,37,8],everyth:[10,29,31,2,28,33,13,18,19,8],isomorph:21,left:[21,28,29,13,32,15,6,7],agon:2,identifi:[7,33,10,4],setcolor:[36,29],just:[1,2,4,5,6,7,8,10,11,12,13,18,19,20,21,28,23,22,29,31,33,35],"__dict__":[22,5,6,29],kdiff3:7,yet:[33,10,1,29,13,28,16,6,18,19,22,36],languag:[21,9,10,11,1,12,3,4,33,28,34,6,18,8,30],previous:[28,4,18],easi:[21,10,1,28,23,33,7,20],had:[21,33,10,11,1,12,2,32,28,16,36,8,20],keyset:[10,28],spread:[4,23],prison:36,falter:1,els:[21,10,1,12,31,28,33,6,7,22,36],functionobject:11,explanatori:10,gave:[2,28],applic:[21,9,10,0,12,4,35,7,8],fortun:28,larman:37,mayb:[13,14,1],metabas:18,background:29,elabor:28,shadow:21,unten:8,readlineconsol:10,apart:21,maxval:10,specif:[21,10,11,1,12,4,16,28,35,18,7,29,14],arbitrari:[33,28],nudg:0,hunt:[28,29,18,36],manual:[28,23],doubledispatch:28,singl:[10,11,29,12,13,4,23,33,28,35,7,22,8],night:[2,10,18],ocbox:29,unnecessari:[10,35,4,12],singletonpattern:22,underli:21,www:[21,33,10,11,1,12,28,16,18,7,29,8,36],right:[21,10,29,2,28,33,13,6,18,7,19],old:28,deal:[10,28,37,23],printf:33,interp:10,somehow:[10,35,28],percentag:2,intern:[16,28,1,4],create_exec:18,borg:22,"5b0":10,indirect:28,successfulli:[7,28,1],atteint:21,txt:[36,12],htmlhelp:7,bottom:[33,11],subclass:[9,10,12,4,28,18,20],suffici:10,condit:[9,11,1,12,4,33,36],foo:[10,13,3,22,33,18,8],paintcompon:29,sensibl:[4,18,23],steamedmilk:20,confer:[2,13,28],speak:[2,35],promot:[2,28],mazegen:36,pylist:10,post:[7,8],"super":[33,22,29,18],create_mc:18,meyer:36,trustworthi:6,unpackag:10,obj:[16,33],getparametertyp:1,slightli:[9,1,12,5,18,29,8],py2float:10,surround:[33,28,36,29],simul:[21,9,28],commit:[7,14],produc:[21,10,28,1,12,2,32,4,23,16,13,18,37,8],makeobstacl:4,dilemma:[32,28],thermostat:[10,18],javac:10,curiou:19,basenam:6,"float":10,encod:23,bound:[2,32,10,28],mocha:20,down:[10,11,1,29,4,36,20],creativ:[2,28,17],weightvisitor:28,coverag:[14,30,18],cappuccinodecafwhip:20,wrap:[10,11,29,28,16,22,8,20],opportun:28,clearchang:29,javax:10,testdumpclassinfo:10,east:36,accordingli:13,wai:[1,2,4,5,7,8,10,11,12,13,18,20,21,28,22,30,29,31,32,33,35,37],frustrat:10,support:[9,10,1,12,2,3,4,33,28,17,7,29],"class":[0,1,4,5,6,8,9,10,11,12,16,18,36,21,22,23,28,29,32,33,35,20,37,38],avail:[21,10,11,1,2,28,33,18],width:[36,29],reli:[16,28,5],editor:[7,13],analysi:21,head:[21,11],medium:21,repetiti:15,form:[21,9,28,1,29,2,15,4,16,33,18],offer:20,altogeth:[21,28],forg:1,heat:12,hear:1,dead:36,heap:[28,35],hashtabl:[],"true":[28,1,12,10,4,33,18],analyst:28,"6dd415847e5cbf7c":7,entryexit:8,pragu:28,setsuccess:11,maximum:[21,33],tell:[10,11,1,12,4,33,28,7,36],minor:29,absenc:1,fundament:[11,21,0,1,33],trim:28,developerwork:18,classif:21,featur:[21,10,1,2,15,28,33,34,7,8],setxi:36,semicolon:33,classic:[28,12],howdi:[10,18],request:[21,11,36,12],"abstract":[21,9,28,4,37],visitabledecor:28,drive:0,exist:[28,0,4,16,6,18],desir:[10,11,5,28,29],download:[2,7,10,16,29],mold:[28,37],check:[10,1,12,29,4,33,28,6,18,7,22,14],assembl:20,pipe:10,mindview:10,metamethod:[9,18],tip:7,refactor:[9,28,1,30],tij:38,test:[21,9,10,11,1,12,28,19,6,18,7,29,14],tie:21,presum:[28,4],smell:12,realiti:10,getsizetupl:29,notif:[21,29],intend:[2,10,1],felt:10,intent:[16,21,32],consid:[21,9,10,11,1,28,23,35,36,18,8,20],phthaloblu:18,bitbucket:[7,9,14,30],receiv:[10,8,29],longer:[10,13,28,33,8,20],furthermor:11,intimaci:28,ignor:[22,28,1,18],fact:[21,28,1,29,10,33,22,8],time:[21,33,10,0,1,12,2,29,4,16,13,11,36,18,22,28,8,20],push:7,backward:[36,30],osx:[7,31],concept:[21,9,10,0,11],chain:[9,11,12],skip:1,consum:[10,5,20],focus:4,invent:[10,35],cafelattedecaf:20,objcount:1,test_x_z:18,metanewvsinit:18,primer:18,milk:20,row:[29,12],decid:[28,12,29,32,10,4,33,35,20],depend:[21,28,30,12,10,4,29,14],decim:33,intermedi:2,certainli:[21,28,29,12,10,4,35,20],decis:[13,16,36,33],jvm:10,text:[9,12,2,15,33,13,6,7,36],jtextarea:10,isinst:[16,31],sourc:[21,10,1,12,2,28,13,7,29,36],string:[9,10,11,1,12,4,33,28,18,29,36],brazillian:2,onlyon:22,"fa\u00e7ad":[9,37],broadli:28,word:[10,11,1,12,0,37,8],exact:[28,4,12,23],jdk:[10,1,29],level:[21,28,1,29,4,33,6,18,8],did:[33,10,6],die:36,gui:[0,4,29],iter:[21,9,10,1,12,4,33,16,28,27],launchpad:[2,13],item:[29,10,4,12,23],team:[2,7,30,9],quick:[9,10,1,33,7,20],round:[35,18],dir:[10,1,18,6],prevent:[9,28,1,29,4,35],plaincap:20,core:[7,33,10],htm:36,compens:21,sign:[7,10,14],bondag:8,cost:[21,20,12],cafelattewetwhip:20,run:[21,9,10,0,1,12,28,33,11,6,18,7,29,8,36,35],corba:10,appear:[21,10,11,1,12,13,8,29,4,33,28,18,22,14,30],filler:28,scaffold:4,current:[21,33,10,1,12,28,16,14,36],suspect:4,newalgorithm:11,shapefact2:4,deriv:[28,1,12,10,4,33,35,18,29],cappuccinodri:20,gener:[1,2,4,6,7,8,9,10,11,12,14,16,18,36,21,22,23,27,28,30,29,32,33,35,37],satisfi:[21,28,11,12,35],modif:[33,28,8,20,18],chainlink:11,address:35,along:[21,33,10,1,12,28,16,35],stem:10,teacher:17,wait:[29,10,28,12],box:[9,10,1,29,4],messengeridiom:5,fenc:21,alti:29,shift:6,clip4:28,queue:11,behav:[10,8,28,12],extrem:[7,28,10,8,1],commonli:[10,28],nmspc:18,trashtyp:28,semant:[33,1],regardless:[28,35],repositori:2,extra:[28,1,29,33,18,20],activ:[13,32,28,4],modul:[9,10,29,3,33,18,8],prefer:[13,18],toarrai:10,leav:[28,29],visibl:10,codemark:6,instal:[9,10,1,29,28,7],forefront:1,gsum:28,anounc:7,newslett:21,prove:[28,8],univers:[21,4],visit:[32,10,28],recycleap:28,subvers:10,everybodi:29,live:10,handler:29,msg:33,scope:33,checkout:[7,14],testid:1,chapter:[33,10,11,1,2,8,28,16,13,34,36,18,38,14,20],capit:18,testpyutil:10,afford:11,peopl:[21,28,1,30,2,32,33,13,17,18,7,8],claus:[33,29,4,12],clue:28,visual:[7,9,29,13],appendix:2,rigid:10,oop:[21,28,1,29],examin:[10,28],alexand:16,jlabel:10,effort:[9,10,11,1,2,28,17],easiest:[7,9,10,32],simplemeta2:18,simplemeta3:18,fly:32,graphic:[36,1,29,4],ibm:18,prepar:8,dmitri:22,battl:[32,4],focu:[13,3,28],flowlayout:10,problemsolv:11,can:[1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21,28,23,22,29,32,33,35,36,37],purpos:[21,28,11,4],problemat:16,claim:11,encapsul:[21,9,28,11,12,4],stream:10,predict:8,wrapped_f:8,explos:28,backslash:[33,10],topic:[2,33,22],heard:28,chih:22,abort:[1,6],proxydemo:35,recycl:[9,28],unfortun:10,occur:[21,28,11,1,12,13,4,23,29],pink:29,alwai:[21,28,0,1,30,10,33,22,14],killanddismemb:4,variou:[21,10,11,1,12,32,4,23,28,0,20],get:[1,2,23,6,7,8,9,10,11,12,13,16,17,18,19,20,21,28,29,32,33,37],ping:10,write:[21,9,10,0,1,12,2,4,33,16,13,11,6,18,29,28,35],anyon:[2,36],actual:[21,33,10,11,1,12,4,23,16,28,35,6,29,8],pure:[10,12],"0x00798900":22,parameter:28,ensconc:10,map:[10,12,32,28,33,36],product:[13,33,10,1],dialog:10,max:29,thermostatdai:[10,18],spot:[13,4],usabl:12,wantmor:12,inputb:12,inputc:12,mac:7,inputa:12,mymethod:29,aop:8,mai:[21,33,10,11,1,12,2,29,4,16,13,34,36,7,22,28,20],underscor:[13,33,22],data:[9,10,11,29,12,4,33,16,28,5,22],grow:34,goal:[21,9,10,1,12,2,28,33,8,36],my_login:7,practic:[33,18],johnson:21,divid:1,explicit:[21,11,8,23],cafelattewhip:20,inform:[10,11,1,12,31,8,29,4,23,33,28,5,18,7,22,14,36],"switch":[28,11,36,35],preced:20,combin:[9,10,11,29,2,23,18,20],block:[13,6],callabl:[8,29,18],talk:[7,21,10,28],vike:33,extractor:[14,1],dojo:17,comfort:[1,37],countobserv:29,greenhouselanguag:[10,18],brain:[33,11],lst:10,codemanag:[6,18],still:[21,10,28,29,12,2,4,33,13,6,18,7,14],stringlist:28,dynam:[21,9,10,11,29,32,4,23,33,28,35,8,20],rosetta:17,group:[21,28,11,29,2,32,33,6,18,7,36,17],thank:[9,30],polici:0,jim:[28,11],platform:[9,10,31],window:[9,10,31,13,15,7,14],curli:33,borgsingleton:22,truli:[],ddtrash:28,non:[21,10,1,2,28,33,18],within:[21,10,29,12,4,33,28,18,8],halt:1,halv:33,sysconf_nam:31,alist:7,initi:[21,10,0,29,12,4,33,28,35,18,7,22,14,36],sorter:28,underneath:7,typedbinmemb:28,pyinteg:10,aesthet:28,therebi:1,half:35,javaclassinpython:10,now:[21,10,1,12,32,4,28,36,18,7,8,30],discuss:[21,28,36],introduct:[9,2,33,18,7,8],term:[21,28,11,1,12,35,37,8],name:[21,10,0,1,12,13,8,29,4,23,33,28,35,5,6,18,7,22,14,20],ppr:28,getweapon:32,didn:[21,33,14,1],oliv:20,phyast:8,separ:[21,10,0,1,12,32,4,33,28,11,18,7,29,35],rock:23,cafemochadecafwhip:20,pizza:20,jmap:10,compil:[21,10,11,1,29,28,33,35,6,18,19,8],domain:10,replac:[10,11,1,13,32,33,8],individu:[7,28,36,20],arg3:8,continu:[28,1,12,10,33,6],tag3_method:18,contributor:[2,9,14,30],parsetrash:28,significantli:8,begun:21,year:[16,21,28,1],happen:[21,10,28,1,12,2,4,13,18,29,8,20],dispos:10,troll:32,shown:[21,28,11,32,10,4,33,20],accomplish:[22,37,29,10,33,28,35,18],cafemochawhip:20,"3rd":[16,20],space:[28,13,10,33,35,6,36],profit:[2,10],antoin:21,profil:10,stuff:13,internet:[1,36],returnstr:10,factori:[21,9,28,12,4,37],"0x7ed70":18,overidden:12,earlier:28,"goto":28,state:[21,9,28,11,29,12,4,33,35,22],getcwd:1,argu:[13,3,16,8,21],argv:6,lab:28,org:[10,11,1,30,14,33,18,7,29,8],"byte":[10,36],care:[13,33,28,4],reusabl:[16,28],couldn:[28,11,1],yarko:[7,14,30],synchron:29,junit:1,recov:28,thing:[21,10,11,1,29,2,28,23,33,13,35,18,7,8],place:[33,10,28,1,12,2,4,16,13,5,17,7,29,8,20,19],greenhous:[38,10,18],principl:[21,9,28,1,12,37],typic:[21,28,11,1,12,33,0,5,18,8,20],think:[21,33,10,11,1,29,2,28,23,16,18,7,8,20],frequent:28,first:[21,9,10,0,1,12,33,29,4,23,16,28,35,6,18,7,22,37,8,20,36],oper:[21,9,10,11,33,12,32,15,4,23,16,28,18,7,8],directli:[28,0,1,2,10,33,18,22],carri:[28,11,12],onc:[21,10,29,28,6,18,7,8,20],arrai:[21,28,12,10,4,33,37,36],getcost:20,crib:31,yourself:[10,12,2,28,33,7],submit:1,ring:[10,18],open:[10,0,1,12,2,28,13,6,18,7,29],size:[2,29,10,1,20],given:[28,0,12,29,10,4,35,36],ian:18,sheet:[7,1],convent:18,stuck:1,teardown:1,caught:12,adjac:29,plastic:28,gnureadlin:10,circl:[18,4,12],showdigit:12,white:[9,28,1,29],conveni:[22,29,13,10,4,35,20],cite:36,pocoo:[14,30],simionato:[8,18],cope:28,copi:[28,12,29,2,35,6,7],specifi:[10,1,12,2,4,33,7],broadcast:12,newcolor:29,enclos:20,enigma:28,changeavail:12,registerleafclass:18,holder:28,than:[21,33,10,11,1,29,13,32,4,23,16,28,35,18,8,20],png:7,serv:[21,4],setattr:22,instanc:[10,1,12,23,18,22,20],applet:0,bintyp:28,were:[10,1,12,4,33,28,18,8],posit:[36,29],stub:35,surrog:[11,37,20,35],seri:8,fork:7,coconut:33,nicer:[7,37,29],svnroot:10,argument:[21,9,10,11,1,12,4,33,28,5,18,29,8],ant:10,prt:10,properli:[10,8,28,23],deliv:10,breakfast:29,kevin:29,leastsquar:11,engin:[32,0,1],squar:[29,4,18],patternrefactor:[28,11],note:[1,4,6,7,8,9,10,11,12,13,15,16,18,19,20,21,28,22,30,29,33,34,35,36],forc:[21,33,10,1,29,2,4,16,35,6,18],ideal:10,take:[21,33,10,0,1,12,2,32,29,4,16,28,11,18,7,22,37,8,20,30],green:[29,18],wonder:18,noth:[21,28,11,1,29,13,36],begin:[21,10,30,13,28,33,7,8],sure:[2,33,10],trace:[8,1,29],normal:[21,28,11,1,32,4,33,18,22],track:[28,12,29,2,35,5],price:[2,28,20,12],drinkcompon:20,beta:10,wire:[28,22],pair:[28,37],neatli:35,televis:22,latex:[7,13,14,30],synonym:21,later:[21,10,11,1,4,28,18,7,22,8,20],sale:2,quantiti:[29,28,22,12],addbranch:7,runtim:[9,10,11,4],parseint:29,link:[7,13,11,14],shop:[2,20],shot:[28,20],linedata:11,show:[21,33,10,11,1,13,3,15,4,16,28,6,18,7,22,8],cheat:7,cheap:[21,28],subprocess:10,mousetrap2test:12,concurr:[3,9],permiss:[10,1],hack:[7,14],ground:10,xml:[10,37,18],onli:[0,1,2,4,6,7,8,10,11,12,13,16,18,20,21,28,23,22,29,32,33,35,37],explicitli:[28,10,4,33,18,8],nexta:12,nextb:12,nextc:12,transact:21,observedflow:29,enough:[10,1,29,13,28,4,7],doubleespresso:20,dict:[22,10,5,6,18],analyz:21,jaroslav:28,clearselect:12,startswith:[6,18],proxy2:35,nearli:1,viewpoint:28,distinctli:12,ddaluminum:28,cannot:[21,33,10,0,12,32,28,16,22],ssh:7,afunct:8,gen:4,requir:[21,33,10,1,12,4,16,28,34,5,6,37,7,29,8,20],jtextfield:10,prime:[28,1,29],reveal:36,isemptyxi:36,aluminum:28,dramat:1,yield:[3,32,4,23],spameggssausageandspam:10,expedi:1,pynam:10,makec:37,through:[21,33,10,11,1,12,2,29,4,23,16,13,35,18,22,28,8],where:[21,10,11,29,12,2,4,23,33,19,5,6,7,28,8,36],vision:2,summari:[9,10,28],wiki:[10,11,30,28,7,8],"__module__":18,onlamp:18,pydictionari:10,booch:28,cafelattewet:20,testcas:[],rmi:35,purest:11,concern:[28,8,1],timeit:10,detect:[28,23,36,31],charat:10,review:[7,9,8,1],enumer:[16,18,6,12,23],label:[10,14,30],getattr:[22,35],trashbinset:28,between:[21,10,1,12,28,35,18,7,29],"import":[21,10,0,1,12,2,3,4,23,33,13,5,6,18,32,29,28],item2:23,across:[10,4],aslist:10,docutil:[],assumpt:[32,28],parent:[7,10],tup:10,screen:[28,0,1,29],inflex:20,cycl:33,pythoncardapp:29,findminima:11,come:[21,10,1,12,2,29,4,33,28,6,7,22,36],readlin:[10,28,12,36],tug:7,ispubl:1,simple4:18,pepperdew:20,quiet:28,contract:2,inconsist:8,improv:[9,28,30,12,2,22,33,13,7],somecondit:1,minima:11,color:[13,29,18,36],overview:[7,9,28],unittest:[28,10,1,12],period:33,dispatch:[9,28,29,32,4,23],yearli:28,colon:[33,10],exuperi:21,consider:[9,28,20],mousetrap:12,coupl:[21,9,28],games2:4,west:36,rebuild:10,mark:[21,33],appframework:0,quiesec:12,reflex:21,astonish:21,spare:33,bypass:18,emphas:[13,28,10,4,18],test_x:18,further:[9,10,1,29,13,3,28,33,18,8],trantabl:12,cafelatteextraespresso:20,findal:6,repres:[33,28,12],"__eq__":[23,12],former:[16,22,18],those:[21,10,1,29,2,4,23,33,28,5,17,18,7,8],newbyt:36,sound:[2,8],myself:[8,17],tostr:10,keygen:7,trick:[10,5,28],cast:[10,28,37],invok:[10,1,28,23,33,18,7,8,20],outcom:[4,23],invoc:20,simple3:18,anytim:[13,29],advantag:[16,22,10,28,12],stdout:10,canon:[9,15],ivi:7,worri:[2,13,16],equal:[21,28,10,1,33],endswith:[10,6],eras:[1,4],myapp:0,couplet:28,shutil:6,fame:28,"__init__":[9,10,0,1,12,33,37,29,4,23,16,28,11,5,6,18,22,36,8,20,35],develop:[21,9,10,1,2,13,18,7],author:[11,29,18],fulful:11,same:[21,33,10,11,1,12,13,29,4,23,16,28,35,18,22,8,20],trip:2,binari:7,html:[10,30,13,8,28,33,6,18,7,14],testrunn:[],customize1:0,pai:[2,10,28],document:[10,1,29,13,8,33,7,14],pollut:21,number_of_processor:31,nest:[33,22,4,20],foam:20,someon:[7,14,29],driven:[38,9,1,12,36],mani:[10,1,12,2,29,28,33,18,7,22,8,20],extern:[9,28,1,12,6],tosynch:29,tradition:[33,1],hummingbird:29,appropri:[21,10,11,1,12,32,4,33,28],macro:[9,11,8],facad:37,connector:21,pep8:13,gameenviron:4,without:[21,9,10,28,1,29,2,4,33,16,13,7,8,20],temptat:18,model:[21,32,28,29,20],dimension:[37,12],arrays2:33,"23f":28,execut:[9,10,11,1,29,4,23,33,28,7,8],excel:[16,18],thermostatnight:[10,18],rest:[21,10,0,1,12,2,4,28,6,7,8],recyclea:28,aspect:[21,10,8,4,29],recycleb:28,touch:[32,28],monei:[2,12],flavor:11,speed:10,pythondecoratorlibrari:8,except:[10,0,1,12,28,23,18,8],littl:[21,10,1,12,28,33,7,8,36],blog:[7,18],pile:21,treatment:28,exercis:[9,10,11,1,12,32,29,4,28,0,17,37,22,20],addmouselisten:29,real:[10,11,36,35],around:[21,28,1,29,13,32,4,33,35,5,36,8,20],todolist:[14,30],"0079ef2c":22,repaint:[36,29],grid:29,pop:[10,28,18],amp:[3,1],rununittest:1,appetit:21,returnarrai:10,mod:36,saniti:1,colorbox:29,stranger:21,chainofrespons:11,integ:[33,10,29],benefit:[10,29,2,28,33,13,35,20],either:[21,10,11,29,23,33,18,20],output:[10,0,1,12,13,8,22,33,30,18,7,14,20],margherita:20,manag:[21,10,11,12,29,32,22],fulfil:[21,11,35],tulach:28,satisfactori:28,adequ:[21,33],inlin:18,constitut:29,nonzero:1,regina:20,slice:10,mood:12,chronicl:21,boxobserverpythoncard:29,definit:[28,0,1,2,10,33,35,8],evolv:[13,21,10,28,1],exit:[36,8,1,29,6],inject:[10,8,18],complic:[28,35,1,20],ratcount:36,refer:[21,28,1,12,2,4,23,33,13,35,36,18,7,22,20,19],power:[7,22,10,8,28],cappuccinoextraespressowhip:20,garbag:[10,1],inspect:[7,9,6,18],typedbin:28,standpoint:1,"__name__":[10,11,1,29,32,4,23,33,6,18,8,20],"throw":[16,10,1,12,4],comparison:[10,18,4,12],central:[16,28,12],greatli:28,strategypattern:11,firstnam:7,camembert:18,conditionc:12,panna:20,splitlin:6,currentlin:36,stand:[21,32,28,35],neighbor:29,act:[21,28,11,8],other:[0,1,2,4,7,8,9,10,11,12,13,14,15,16,18,20,21,28,23,22,29,32,33,35,36,37],routin:35,effici:28,activest:18,lastli:[16,10],quietli:10,"75f":20,strip:[28,20,1,12,6],counterintuit:28,your:[0,1,2,4,6,7,9,10,11,12,13,15,16,18,20,21,28,23,22,29,31,32,33,35],wustl:28,log:29,aren:[21,18,1,13,33,37],cpu:31,commenttag:6,overwrit:6,hee:35,stealth:10,interfac:[21,9,10,11,29,12,32,4,33,16,28,35,37,20],low:[21,28],lot:[21,10,1,12,2,28,33,18],pollin:32,strictli:28,machin:[7,9,12,31],unam:10,lang:[10,28,18],tupl:[33,10,5,23],bundl:37,regard:21,vendingmachin:12,stepanov:16,conciev:12,"0076aa3c":22,functor:11,mice:12,conclus:16,faster:[10,1],notat:10,tripl:33,algorithm:[21,9,28,11,29,4,16,36],impenetr:1,possibl:[21,10,28,1,12,2,4,33,13,35,36,18,22,8,20],"default":[28,11,1,29,31,10,18,7,36],asynchronizedmethod:29,grasp:33,embed:10,connect:[21,22,11,29,12,10,28],gone:[10,11],creat:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,20,21,22,23,28,29,30,32,33,35,36,37],certain:[28,12,15,10,18,20],whatihave2:37,strongli:33,intro:[14,18],file:[9,10,0,1,12,13,15,28,33,11,6,7,29,14,36],jargon:32,rearrang:16,cream:20,incorrect:16,again:[2,28,10,1,33],setval:10,googl:7,want:[21,33,10,11,1,12,2,29,4,23,16,13,35,5,37,7,22,28,8,20,30],tradeoff:20,my_decor:8,compel:[21,10,6],depth:18,event:[21,10,0,29,18,36],idiom:[21,9,11,29,25,35,7],valid:[10,1],compet:23,jset:10,you:[0,1,2,4,5,6,7,8,9,10,11,12,13,15,16,18,19,20,21,28,23,22,29,31,32,33,35,36,37],getdescript:20,interactwith:4,architectur:[2,21,10,29],check_result:6,registri:[10,18],sequenc:[21,33,10,11,12,28,16],tbin:28,vocabulari:21,pool:22,reduc:[1,20],assert:[37,18,1,12,4],multiplejython:10,opennotifi:29,directori:[10,1,13,28,6,7,14],descript:[10,1,12,28,6,18,7,22,14,20],hello:[10,8,12],gradient:21,mass:29,potenti:[21,29],escap:12,fillabl:28,represent:12,all:[0,1,2,4,6,7,8,10,11,12,13,16,18,19,20,21,28,23,22,29,32,33,35],dist:10,skeleton:35,messi:[28,23,31],lack:[10,1],dollar:12,sanitycheck:1,monti:33,abil:[21,29,2,32,13,18,8],follow:[21,10,28,1,12,2,4,23,33,13,35,5,18,7,29,8,20],research:[2,10,37],hashmap:[10,28,12],uses_metaclass:18,edong:7,"__cmp__":[10,18,12],init:0,program:[21,9,10,11,29,1,12,33,2,15,4,23,16,13,6,18,22,28,8],hasattr:[18,31],rstrip:6,contentpan:10,fascin:18,"case":[33,10,11,1,29,2,4,23,16,28,35,5,18,22,8,36],liter:[33,23],straightforward:[21,10,28],fals:[28,10,6,12],checkin:[7,14],faq:7,util:[33,10,1,29,16,7],defvar:7,candid:[16,21],mechan:[9,28,0,13,23,16,33,11,18,8,35],fall:[8,1,31],veri:[21,9,10,11,1,29,2,4,23,33,13,7,22,8,36],bottleneck:10,bruceeckel:[7,16,10,21,1],lisp:8,list:[21,9,10,0,1,12,2,8,4,23,33,28,11,5,6,18,7,29,14,30],signific:[13,16,28,1,36],emul:29,asingleton:18,small:[2,13,21,20],everth:15,dimens:29,tag1:18,tag2:18,tag3:18,pyobject:10,tea:20,eas:[28,20,12],tee:35,tex:7,zero:[10,1],pressur:1,design:[21,9,10,11,1,12,13,32,29,4,33,16,28,35,6,37,22,8,20],pass:[10,11,1,12,32,29,4,23,33,28,35,5,18,7,22,37,8,20],whene:35,val2:33,new_f:8,deleg:[28,35,22],brien:28,ntotal:28,advanc:[2,11,18],abl:[21,10,0,1,12,2,4,23,16,13,11,28,36,35],brief:33,overload:[33,10,28,18],version:[10,28,29,12,2,8,4,23,33,13,18,7,22,37,14,19],succinct:[10,8],fillbin:28,method:[21,9,10,0,1,12,32,29,4,23,33,28,11,6,18,22,37,8,20,35],contrast:33,movement:[21,28,11],hasn:[28,29,18],full:[7,33,10,35,6],themselv:[21,33,29],variat:[21,28,37,22,12],sophist:[33,10,1,4],rlock:29,shouldn:[7,11],excess:12,demet:21,rudimentari:33,modifi:[10,28,1,12,2,32,29,4,23,33,13,18,7,22,8],valu:[10,1,12,28,23,33,5,37,8],search:[9,28,0,1,33,18,7],upcast:[28,4],ahead:[33,1],vegetarian:20,popen:10,observ:[21,9,28,1,12,22,29],prior:28,amount:[28,11,1,12,15,10],pick:28,action:[21,9,10,11,12,4,28,35,18],introductori:[9,10,2,33,7,8],scurri:36,pytupl:10,via:[10,2,28,23,18,7],shorthand:10,primit:[10,28],transit:[9,12],"while":[21,10,11,1,12,2,28,33,35,18,36],readili:21,filenam:[28,6,36],inappropri:[10,1],ystart:36,famili:[28,11,23],viewpost:18,establish:[16,33,28,1,12],jbutton:10,select:[21,9,10,11,29,12,13,28,7,20],kittiesandpuzzl:4,aggress:33,twa:10,proceed:28,distinct:[21,22,11,12,10,28,35],tackl:28,two:[10,0,1,12,2,32,29,4,23,33,28,35,6,18,22,37,8],bizarr:8,getweight:28,autonom:36,machinediscoveri:31,taken:[13,28,10,1,4],automati:[],showtot:12,singletonmetaclass:22,more:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,20,21,22,23,28,29,30,32,33,35,36,37],flaw:1,door:12,mydialog:10,apologet:8,reconfigur:32,convinc:1,ddcardboard:28,flag:[10,29],stick:[8,18],particular:[21,33,10,11,1,12,2,4,16,28,35,36,7,22,20],known:28,compani:[2,10],cach:10,dictat:2,none:[22,12,1,29,10,18],pyprog:1,valuabl:28,dev:7,histori:[7,9,8,6],testdemo2:1,remain:[16,28,12],caveat:[19,1],learn:[21,28,2,33,13,7],returnchang:12,statedemo:35,dee:35,def:[0,1,4,5,6,8,10,11,12,16,18,36,22,23,28,29,31,32,33,35,20,37],prompt:7,scan:13,challeng:36,registr:[9,18],share:[2,7,22],accept:[10,32,28,16,18,7],fiddl:35,minimum:[7,33,10,29],explor:16,statet:12,phrase:1,magenta:29,condemn:28,huge:20,cours:[21,10,1,30,2,4,28,35,37,20],newlin:33,awkward:10,secur:[10,8],programmat:[20,18],anoth:[21,10,11,29,12,32,4,33,28,35,18,7,22,8,20],mouseact:12,myratno:36,ish:[13,33],smalltalk:[21,29],simpl:[9,10,0,1,12,4,33,28,35,18,7,29,37],css:[14,30],distro:10,plant:28,resourc:[9,1,29,37,14,36],algebra:16,variant:28,reflect:[9,10,28,1],tabl:[9,12,32,23,16,33,35,38],associ:[33,10,28],"short":[33,31],waysid:1,ani:[21,33,10,28,1,12,2,29,4,16,13,35,36,18,7,22,8,20],confus:[28,37,29,32,33,18,8],ambigu:10,caus:[21,10,1,12,32,4,33,28,7,29],flwr:32,"0x7ecf0":18,setchang:29,egg:[33,22],sysctl:31,help:[21,28,29,2,3,13,35,17,7],mazework:36,soon:1,held:[21,35,12],pythondialog:10,paper:[28,23],scott:21,cyan:29,hierarchi:[21,28,11,32,4,23,33,35],taxonomi:[21,9],implicitli:[21,33,10,4],realiz:[16,21,28,1,33],paramet:11,latt:20,style:[11,1,12,13,33,30,18,14],conjugategradi:11,alli:17,late:[28,20],rapidli:[10,29],runal:12,pythondecor:8,might:[21,10,11,1,29,2,4,23,16,28,8,36],attch:18,currentst:12,wouldn:[28,1,4],good:[21,10,1,12,2,28,33,13],"return":[33,10,11,1,12,31,32,29,4,23,16,28,35,5,6,18,22,37,8,20,36],martelli:22,ringbel:18,ttbinlist:28,framework:[21,9,10,0,1,12],somebodi:[2,7],complain:33,bigger:[10,12],whatiw:37,intricaci:4,customize2:0,hook:[9,29,18],solver:11,instruct:[7,1],refresh:[14,6],easili:[21,10,11,1,12,28,23,5,18,22,37],achiev:[28,10,18,22,8,20],compris:8,getmodifi:1,found:[21,28,1,14,36,7,8,20],max_num:28,button:[7,10,4],harm:[9,28,12],weight:28,hard:[13,16,28,4,32],idea:[21,10,11,12,2,8,4,13,35,17,7,28,14],procedur:28,realli:[21,22,11,12,10,33,28,37],finish:[21,10,1,12,7,8],evalpap:23,windowadapt:29,ddpaper:28,http:[10,11,1,12,8,28,30,18,7,29,14,36],todo:[9,10,30,6,7,14],orient:[21,28,11,10,4,33,8],flower:[9,29,32],safeti:[33,1],classvariablesingleton:22,differentreturn:33,miss:[21,28,10,6],setsiz:[36,29],publish:[2,28,10,1],princ:21,footnot:[21,10,11,1,12,28,22,14],gameelementfactori:4,print:[0,1,2,4,5,6,8,9,10,11,12,13,14,18,20,28,23,22,29,32,33,35,36],qualifi:[33,1],lutz:33,proxi:[21,9,10,12,22,16,35,37,20],hashset:10,pub:18,reason:[21,10,11,1,12,2,4,33,28,35,18,37,8,20],base:[21,10,0,1,12,2,32,29,4,23,33,28,11,18,7,22,36,35],put:[21,9,10,28,1,12,2,8,4,33,13,5,6,18,7,22,14,17],teach:[2,9,1,17],bash:1,basi:[1,29],thrown:28,thread:[7,29,18,36],script:[13,9,10,11,33],struggl:21,revolutionari:1,perhap:[28,1,13,32,10,4,37],pythonsw:10,ascher:33,trashsort:28,lifetim:35,clump:5,assign:[10,33,5,18,7,8],major:[33,8,18],notifi:29,obviou:[16,28],blush:28,feel:[7,13,21,1],articl:[3,15,18],lastnam:7,number:[21,10,11,1,12,31,13,29,28,23,33,35,36,37,7,22,8,20],placehold:12,sayhello:8,done:[10,11,1,30,2,4,33,13,7,29,14],least:[21,10,1,28,33,7],colorboxestest:29,stabl:10,actionperform:10,fanci:12,gpl:10,razor:21,differ:[21,33,10,11,1,12,8,4,23,16,28,35,6,18,32,7,29,14,20],decoupl:[16,9,11,29],printstacktrac:[28,1],interact:[32,10,4,37,23],tove:10,construct:[16,10,8,1,18],addfactori:4,paint:[13,36],toi:18,expand:[7,35],statement:[10,11,1,12,4,33,28,35,29,8],scheme:[32,28,29],syrup:20,store:[8,1,12],itempairgen:23,imperfect:13,option:[21,11,29,2,33,6,7,20],relationship:[21,18],behind:[21,35],checklist:21,shapefactory1:4,shapefactory2:4,convieni:18,pars:[33,9,28,23],consult:2,off:[21,10,29,2,15,28,33,18],eventu:[21,1],tortoisehg:7,albeit:[21,33,10,28],kind:[21,33,10,1,12,2,32,4,23,16,28,35,29,8],plop:28,whenev:[21,28,0,29,4,5,7,8],remot:35,gotten:12,remov:[21,28,29,12,2,16,18],kapow:10,pythoninterpret:10,reus:[21,28,0,12,10,11,22],getconstructor:[10,28],toward:[21,1],danc:35,builder:[],runsawai:12,comput:[10,28,18],nastyweapon:4,ardent:1,requisit:1,"null":[35,1,12,36],sell:2,imagin:[28,4],"0x7ed30":18,built:[21,9,10,11,1,29,2,28,33,35,7],equival:[28,1,29,10,33,18],restfil:[10,6],self:[0,1,4,5,6,8,9,10,11,12,16,18,36,21,22,23,28,29,32,33,35,20,37],violat:10,typediter:16,also:[21,33,10,11,1,12,2,29,4,16,13,36,17,18,38,7,22,28,8,20,30],bgboxobserv:29,build:[9,10,0,1,33,2,32,37,4,16,13,18,7,28,14],mouseev:29,brace:33,distribut:[7,13,10,4],exec:[10,18],blackboard:36,eater:32,lighton:[10,18],reach:[21,11,36],mixtur:20,addobserv:29,most:[21,10,0,1,29,2,4,28,11,5,8,20],plai:[32,28,4],jsp:18,cygwin:7,eaten:32,thidiscuss:11,maco:31,alpha:10,amaz:[10,8,36],fileread:36,bug:[7,32,28,1],clear:[21,12,29,2,18,8],cover:[2,13,34,0,1],roughli:[1,12],"_shared_st":22,ext:[14,30],part:[21,9,10,0,1,29,2,8,28,26,33,24,25,11,6,18,7,14,20,36],clean:[33,28,10,1],jython2:10,xstart:36,latest:7,mousetrap2:12,mousetrap1:12,tri:[10,11,28],test3:[10,1],flowergen:32,canvaswidth:36,particularli:[13,33,28,23],uncov:10,font:[2,10],fine:[28,4,18],find:[21,10,11,1,2,4,33,13,18,7,28,8,20],impact:[28,8],less:[21,28,1,13,5,18,8,20],solut:[21,10,11,1,12,29,4,23,28,18,22,20],pyutil:10,templat:[9,10,0,12,2,4,33,16,13,11,28,8],darkgrai:[36,29],shapefact1:4,affirm:[33,1],unus:21,cappuccinodecaf:20,express:[21,10,1,13,23,33],entry_exit_class:8,swing:10,nativ:[7,10],mainten:[28,20],wateroff:[10,18],ineffici:29,doubli:29,classset:18,cyclic:12,stl:[16,10,11],common:[21,10,1,12,2,4,33,28,35,17,29],wrote:[10,1],commod:28,cafemochawetwhip:20,pyexcept:10,adopt:1,creator:[7,11,30],overwhelm:[7,18],startup:[7,10],potent:10,emac:[7,9,14],bare:29,aluminumbin:28,arg:[28,1,29,10,33,18,7,22,8,36],close:[29,1,12,36],horizont:36,cafelatt:20,analog:33,dwarf:32,expert:[13,11],someth:[21,10,11,1,12,2,32,28,23,33,13,17,37,29,8,20],artima:18,conditionb:12,conditiona:12,weakli:[],won:[10,29,2,28,33,13,18],mutex:29,autogener:[14,30],experi:[2,21,10,8,1],nope:1,birkenfeld:7,altern:[21,10,1,3,28,18,8],signatur:[33,10],str:[33,29],numer:[0,5,11,23],hasnext:[16,28,10,1,12],complement:21,sole:11,isol:[21,28,11,4],statemachin:[9,12],disallow:[4,18],cachedir:10,len:[11,36,1,29,6],solv:[21,10,11,1,12,3,28,23,33,35,18,32,29,37,36],extraespresso:20,both:[21,10,29,13,4,23,33,28,35,36,18,7,22,8,20],"__instanc":22,last:[32,10,0,28,18],hyperlink:14,arraylist:[10,28],alon:[28,29],undetermin:0,context:[9,11,14],forgotten:15,commandpattern:11,whole:[28,11,1,12,2,10,29],load:[28,10,4,37,7,36],randomli:[32,1],simpli:[21,33,10,0,30,12,32,28,16,35,5,37,29],point:[21,28,11,1,12,31,2,29,4,33,13,18,7,22,8,36,19],schedul:[32,10],sweep:1,ceruleanblu:18,arbitrarili:[35,18],header:7,templatemethod:0,param:10,linux:[7,14,18,31],throughout:[21,28,0,1,13,4],simpler:[21,22,1,29,28,35,18,8],identif:28,java:[9,10,1,12,33,4,23,16,28,35,6,18,19,29,8,36],dum:35,due:1,empti:[36,29],sinc:[21,10,11,1,12,4,33,28,35,18,29,8,20],mercuri:[7,9,14,30],newinst:[28,1],pushnew:7,strategi:[9,11,6],addison:[28,11],versa:33,execfil:10,clariti:[13,20],imag:[13,29],convert:[10,0,12,29,16,14],coordin:36,changeimp:35,understand:[21,10,12,13,28,33,18,22,8],demand:[2,33,35,1,4],makedir:6,fillablevisitor:28,look:[21,10,11,1,12,13,8,29,4,33,28,35,18,32,7,22,14,20,30],packag:[33,28,10,1,12],frozen:29,buildtabl:12,getquant:12,decrquant:12,smart:[10,35,12],behavior:[21,10,11,29,12,28,23,16,37,22,8,36],sublclass:18,"__hash__":12,anonym:[9,28,38],fum:10,everyon:[30,29,2,33,13,17],errmsg:1,pack:10,argin5:10,argin4:10,pound:33,argin1:10,argin3:10,argin2:10,readi:[2,7,28,0,36],petal:29,itself:[21,10,11,12,13,28,8,36],makea:37,coroutin:[3,9],attach:[13,9],chase:4,decor:[9,28,29,8,22,16,18,14,20],guido:30,minim:[21,1,29],boxwidth:29,belong:2,on_openbackground:29,shorter:10,read:[21,9,10,0,1,12,31,2,3,28,33,6,18,29,8,36],conflict:7,higher:7,cappucino:20,vertdir:36,optim:[10,28],painless:28,wherea:[33,10,11,28,12],wilson:8,setbackground:36,user:[9,10,29,12,2,4,16,28,7,22],cardboardbin:28,focal:21,recent:[10,1],propon:28,task:[7,13,29],lib:33,eleg:[21,28,22,33,35,8],openobserv:29,entri:[13,8,10,14,36],localarrai:29,propog:29,parenthes:33,jythonc:10,testpythontojavaclass:10,chees:12,expens:[28,35],elev:[28,12],academ:1,imit:[7,33],propos:[7,21],explan:10,pyfloat:10,valueof:28,obscur:21,shape:[28,4,18],world:[21,10,11,8,1],"67f":28,dumpclassinfo:10,dirlist:11,cut:[28,37,29],indexof:[10,28],mydecor:8,bick:18,branch:[7,9,28,14,36],snag:29,correcton:2,appli:[21,28,12,1,29,33,37,8],input:[3,0,12],subsequ:[33,18,12],brainstorm:21,bin:[7,28,10,1],tomap:10,vendor:[32,28],transpar:[10,1,20],big:[33,8],intuit:10,game:[4,29],alias:35,verion:7,bit:[33,10,29,2,28,4,16,35,8],characterist:0,formal:[33,8],fillablecollect:28,success:[21,10,11,1,28,16],nextstat:12,signal:10,resolv:28,fluf:13,collect:[21,22,11,1,12,28,37],"__new__":[9,22,18],sizeabl:20,javabean:10,encount:[28,1,29,10,4,16],"0076daac":22,often:[21,10,11,1,12,2,32,15,28,33,13,5,17,18,29,37,8,20],acknowledg:[21,33],creation:[21,9,10,28,1,12,2,29,4,33,16,13,18,22,8],some:[0,1,2,3,4,5,7,8,10,11,12,13,14,17,18,36,21,23,28,30,29,31,33,37],back:[21,10,11,1,12,2,28,29,8,36],global:[10,1,18],understood:[10,1],wxpython:29,mirror:21,sprint:2,surpris:[33,8],mousepress:29,syndrom:28,rien:21,scale:[3,10,1],chocol:20,mousemov:12,though:[22,1,29,28,18,8],per:[21,29,20,12,33],usernam:7,substitut:[33,8],mathemat:[11,23],larg:[10,12,2,3,28,34],market:32,fornam:[28,1],reproduc:2,norvig:29,cgi:[33,28],addel:36,patient:10,lose:[32,10,28,23],agreement:10,viabl:21,step:[21,33,10,1,2,4,16,28,18,7],initialst:12,subtract:21,impos:[16,12],sellimaginaryproduct:32,constraint:[21,33,28,12,2,16,8],materi:[2,13,10,17],memori:1,libero:12,modal:10,cappuccinodrywhip:20,gamma:21,plan:10,predat:32,repair:28,"__future__":[32,4,23],emphasi:18,pythonpath:33,dispens:12,oreilli:33,fowler:[28,8],rapid:10,"caf\u00e9":20,ensur:[7,21,35,1,6],chang:[21,9,10,0,1,12,13,32,29,4,28,34,35,6,18,7,22,37,8,20],artifici:1,occupi:33,inclus:[21,33],institut:1,spam:[33,22,29],valuminum:28,question:[7,21,10,28,12],fast:[13,33,10,1],custom:[7,10,0,28,20],clip3:28,clip2:28,clip1:28,arithmet:36,includ:[21,33,10,29,1,12,15,28,16,30,17,7,22,8,20],suit:1,forward:[21,10],jarrai:10,blueprint:[2,7],larri:28,hawaiian:20,great:[2,19,10,21],sc_nprocessors_onln:31,quiescent:12,translat:[21,9,10,28,1,12,2,4,23,16,13,29,14,36],delta:6,line:[9,10,0,1,12,8,15,28,33,11,5,6,7,29,14,36],talli:28,info:[28,5,29],concaten:33,consist:[21,28,1,29,13,4,33,18,20],balabanov:22,strang:[33,4,12],jpython:10,priveleg:10,fillrect:[36,29],pythoncard:29,similar:[21,10,11,1,12,28,33,35,18,29,8],toomuchaccess:1,parser:28,chao:1,doesn:[21,10,29,12,2,8,28,23,33,13,6,18,22,37,14],lectur:17,"char":[10,36],guarante:[7,12],cafe:20,blackboxtest:1,titl:[10,29],water:[10,18],windowi:7,appendic:13,intvalu:10,tbinlist:28,"_imag":13,mouseclick:29,getbound:36,cappuccinoextraespresso:20,nice:[2,7,33],draw:[0,4,36,23],getdeclaredclass:1,pythoninterpreterget:10,state_d:35,topydictionari:10,est:21,eval:[4,23],itemavail:12,pymeta2:18,pricevisitor:28,svn:10,jc2:10,vice:33,downcast:28,actionlisten:10,entryset:10,normpath:6,discrimin:33,jpanel:29,greenhousecontrol:10,mindlessli:28,karma:[2,13],far:[21,33,28,1,18],java2pi:10,showmsg:33,prototyp:[21,9,10,28],code:[0,1,4,6,7,8,9,10,11,12,14,15,16,17,18,20,21,28,29,32,33,35,36,38],partial:33,unclassifi:28,scratch:[10,8],tclone:28,ellips:18,"__getattr__":[22,35],edu:[28,8],benevol:2,privat:[22,0,1,29,10,7],successfuli:10,elsewher:13,friendli:1,send:[2,33,10,35,28],simplemeta1:18,granular:1,becam:1,paperscissorsrock2:23,sens:[21,10,11,1,4,33,28,5,18,8,20],ajout:21,sent:10,func2:8,func1:8,cheapli:[10,28],mainstream:8,sausag:22,mous:[29,12],testdemo:1,electron:[2,13],alik:2,volum:[2,13],whatius:37,makeschang:12,kitti:4,recip:[9,18],magic:22,counterproduct:28,knight:35,proxyadapt:37,fewer:18,"try":[21,10,11,1,29,13,28,37,7,8,36],session:12,mousetraptest:12,myfunct:33,pleas:[2,7,14,19],boxobserv:[1,29],"__metaclass__":[22,18],readabl:33,natur:[28,1,29,13,33,8,36],verbiag:33,elisp:7,annot:[8,12],jump:8,slithi:10,binset:28,singletondecor:22,changeneighbor:29,odd:[35,20],click:[7,13,29],append:[10,11,1,29,33,6,18,7],compat:30,index:[9,10,11,13,28,5,7,14],pymeta:18,compar:[28,11,1,10,18,7],espresso:20,access:[22,1,29,4,33,35,8],deleteobserv:29,runuculu:32,mouseadapt:29,whatev:[13,28,1],ibid:21,absolut:33,mikewatkin:18,getmethod:[10,28],closur:8,intercept:[9,18],let:[10,1,12,13,4,28,8,20],becom:[21,33,10,1,12,28,16,18,29,20],implicit:8,remark:[33,10,28],talent:2,convers:10,musser:16,larger:[28,30],technolog:[13,1],makeb:37,orgpattern:28,scatter:28,staticmethod:[22,18,4,6,37,8],earli:[13,19,10,1],nameless:10,ratcanmov:36,evalrock:23,chanc:11,boxi:18,win:[32,10,23],app:29,foundat:[9,18,24],"_updat":6,pyton:10,expect:[21,10,28,23,33,19,8],hennei:21,"boolean":[10,28,12,36],notenough:12,limb:8,newimp:35,puriti:10,fee:10,from:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,28,29,31,32,33,35,36,37,38],sysconf:31,zip:[7,6],commun:[2,10,36],doubl:[9,10,32,28,4,33,23,22],addtrash:28,whatihave3:37,next:[10,11,1,12,4,16,28,22,36],implic:20,few:[5,20],camera:2,usr:[7,1],stage:[21,28,20],remaind:[7,9,28,14],sort:[21,33,10,11,28,16,18],clever:[21,18],src:7,trait:18,tplus1:8,impress:[10,28],train:2,bufferedread:36,iii:[9,26],starter:36,account:[7,1,20],chdir:1,retriev:[],when:[21,10,11,1,12,2,32,37,4,23,33,19,35,36,18,7,29,28,8,20],critic:10,thin:4,meet:[32,28,12],fetch:[28,29],aquamac:7,proof:28,control:[21,9,10,11,29,12,13,4,33,28,35,7,22],cafemochawet:20,process:[21,33,10,0,1,12,13,4,23,16,28,11,18,7,8,20],lock:[2,8],high:[21,28],tag:[13,4,12],trashvisitor:28,csum:28,onlin:[13,29,18],kevlin:21,delai:[10,12],friendlier:7,comedi:33,georg:7,shapenamegen:4,sig:10,feta:20,subdirectori:[28,10,1,6],instead:[21,10,11,1,12,4,23,28,18,7,29,8,20],sin:10,stock:7,everywher:18,overridden:[33,28,0,1,12],pyarrai:10,hazard:11,callback:[28,11,29],rmtree:6,multipl:[9,10,11,29,13,32,28,23,33,7,22],"120dpi":7,cheaper:21,physic:36,alloc:1,drop:28,essenti:[21,28,11,1,10,33],seriou:1,newvsinit:18,correspond:[28,5,1,20],element:[21,10,1,12,28,33,18,8],issu:[13,21,28,22,18],allow:[21,10,11,30,12,32,4,28,0,18,29,8,35],subtyp:[28,18],horizdir:36,espressodecor:20,insight:[21,28],cleverdevil:18,evolutionari:28,comma:33,ponder:21,perfect:[2,13,28,21],outer:[22,10,37,1,29],chosen:[2,29,18],settitl:29,gnomesandfairi:4,newsgroup:7,repetet:18,decaf:20,criterion:29,tst:1,typemap:28,rat:[9,36],factor:[21,33,10,1],greater:10,"__getitem__":10,handl:[21,33,28,0,14],auto:7,spell:2,dai:[2,10,18],ctor:28,devel:7,dat:28,mention:[2,28,11,1,4],snake:33,front:[9,35,20],mylist:18,strive:28,multiprocess:3,somewher:[7,4,29],anyth:[21,10,1,29,2,28,13,8],edit:[9,28,16,33,18,7],tran:12,quest:21,mode:[2,7,10,6],isclass:6,batch:33,reserv:1,newtonsmethod:11,psum:28,flair:13,subset:[28,20],chung:22,tolist:10,spoken:28,transitionb:12,transitionc:12,nodecor:20,"static":[21,9,10,1,12,4,33,28,6,18,22,37,20],"_delta":6,whet:21,our:[10,8,28,18],patch:[7,29],transitiont:12,special:[28,10,4,33,35,18,7],out:[21,9,10,28,1,12,31,2,29,4,23,33,13,18,7,22,8,19],variabl:[7,33,22,12],matt:8,contigu:29,cwr:36,dongwoo:7,hive:22,categori:[21,8,29],texliv:7,suitabl:10,rel:28,merg:[7,9,14],metaclass:[9,22,8,18],clone:[7,28],red:[29,18,36],clarifi:2,insid:[10,1,12,4,33,28,37,7,29,8],sortintobin:28,manipul:[16,10,18],standalon:7,dictionari:[10,37,12,4,23,33,5,18,14],tempt:35,releas:[29,1,12],embarrass:1,indent:[13,33,6],could:[21,10,11,1,12,2,29,4,33,28,35,5,22],ask:[21,10,29,4,16,28,36,7,20],membership:28,david:[21,33,18],length:[28,12,1,29,13,10,36],enforc:1,outsid:[33,28,10,4],distinguish:[28,10,14,1],south:36,os_walk_comprehens:6,getclass:[16,32,10,28,12],qualiti:[21,1],scene:35,echo:[],date:10,set:[9,10,0,1,12,2,29,4,23,33,28,11,6,18,7,22,37,8,20],flyweight:12,newsingleton:22,facil:2,redund:11,cafemochaextraespressowhip:20,prioriti:7,"long":[10,28,2,4,33,13,35,7,22,8,20],start:[21,9,10,0,1,29,31,2,28,23,13,18,7,22,8,36],unknown:[28,23],licens:[2,9,10,22,17],isassignablefrom:1,mkdir:10,system:[21,10,11,1,12,31,2,32,15,4,23,13,18,7,28,36,19],wrapper:[10,28],cleverli:13,which:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,18,20,21,28,23,22,29,32,33,35,36],termin:[33,11,1,36],prong:28,shell:[7,33,10],rsa:7,exit_on_clos:[10,29],slider:4,rst:[2,7,14,6],exactli:[33,10,28,20],readlinelib:10,haven:[13,28],priveledg:[],cpython:10,embodi:21,split:[29,6,18],see:[0,1,2,4,6,7,8,10,11,12,14,16,18,19,20,21,28,22,29,33,35,37,38],structur:[21,9,10,11,1,12,28,16,33,35,36,20],bee:[32,35,29],bind:[2,28,23],steer:36,imho:33,aggreg:28,isstat:1,clearli:[21,28,20,1,12],have:[0,1,2,4,6,7,8,10,11,12,13,15,16,17,18,19,20,21,28,23,22,29,30,32,33,35,37],cohes:[21,28],need:[0,1,2,4,5,7,8,10,11,13,14,17,18,20,21,28,23,22,29,30,32,33,35,37],north:36,turn:[21,10,1,12,2,28,33,35,36,29,14,20],gentli:8,lightgrai:[36,29],smallest:[28,20],min:29,rout:21,rmic:35,mix:28,discret:10,sei:1,frontmatt:14,linda:16,tymciurak:7,uppercas:0,entry_exit:8,unless:[2,35,1,6],clash:28,awt:10,minimasolv:11,discov:[21,9,28,1,31,13,4,7],rigor:[33,1],textui:[],mactex:7,why:[21,33,28,8,18],changealgorithm:11,wikic:28,gather:21,stronger:33,face:28,inde:[28,10,22,8,1],"__slots__":18,bui:2,michel:[8,18],determin:[33,28,11,12,4,23,16,36],gettotalcost:20,occasion:1,constrain:1,inexpens:28,gain:[2,18],statemachine2:12,dbm:12,mainloop:29,bring:[21,10,2,28,33,8,36],debat:13,trivial:[28,10,1,12],anywai:[13,33,11],pythoncardprototyp:29,redirect:[22,10,1],textual:29,locat:[10,11,1,12,28,7,14],nois:1,createbox:29,hadn:12,winner:32,jar:10,mug:20,should:[21,33,10,11,1,12,13,3,4,16,28,36,18,7,29,8,20],restructur:[2,7,6,13,9],suppos:[28,1,29,10,4,33,8],esqu:33,disciplin:8,inhabit:32,local:[21,28,29,2,7,20],hope:[21,14,17],move:[21,10,11,1,12,2,28,13,36,7,29,14,30],contribut:[2,7,30,13,9],espinc:28,ludicr:28,familiar:[7,16,28],disagre:6,autom:[10,1,12,13,15,28,18],regularli:[28,20],piecewis:11,bean:10,increas:1,applicationframework:0,triangl:4,extract:[28,10,1,6],enabl:[10,8],organ:[21,28,1,2,18,7],bisect:11,coplien:[28,11],mertz:18,grai:29,whatiuse2:37,integr:[33,28,11,1,29],contain:[21,9,10,29,12,4,33,16,28,6,37,7,22],grab:28,ddglass:28,view:[13,29],conform:20,"0079e10c":22,frame:[10,36],knowledg:[33,1,4],popen2:31,displai:[33,10,8,1,6],temporarili:10,troubl:[7,33,10],py2int:10,syntact:32,polymorph:[9,28,32,4,23,33],statu:28,error:[28,1,12,13,10,6,29],dlg:10,correctli:[7,1],pattern:[21,9,10,11,1,12,32,29,4,16,28,26,6,37,7,22,8,20,35],boundari:[7,10],misus:[21,28],tend:[21,33,28,1,18],favor:21,written:[33,29,11,1,18],"__bases__":18,japplet:0,progress:[7,8,14],bunch:28,email:[7,21],pazzaglia:16,bed:29,kei:[28,12,32,10,23,33,37,7,20],p2j:10,itertool:[27,9],job:[2,33,28,0],entir:[21,10,29,28,33,8],cafelattedecafwhip:20,addit:[10,1,12,2,28,33,35,18,7,29,8],exclaim:33,boxheight:29,admin:13,invulner:28,loveandtheft:8,etc:[28,0,2,4,23,19,11,7,8,20],admit:[21,28],succeed:11,equat:8,section:[21,10,32,28,4,34,37,7,14],freeli:[16,10,1],comment:[7,33,10,1],make_fil:6,interp2:10,"0076c54c":22,simpleclass:33,wall:36,guidelin:[13,33,28],arriv:28,chmod:10,walk:[21,10,1,6],vend:[9,12],incess:30,respect:28,labor:21,quit:[10,1,12,13,4,33,18,8,20],htmldiff:6,decent:21,obstacl:4,compon:[16,29,10,28,20],treat:[28,10,1,12],nextto:29,immedi:[28,8,1,36,4],inneradapt:37,bulk:[13,28],espressoconpanna:20,togeth:[10,11,28,33,35,37],present:[21,28,1,12,10,37,20],multi:12,main:[10,0,1,29,2,28,33,7,36],plain:[7,20],align:33,harder:10,defin:[21,33,10,0,1,12,29,4,16,28,5,18,22,8,20],aarrgggh:36,decept:10,ill:28,cafemocha:20,htmlbutton:10,layer:[21,20],almost:[21,10,29,32,33,8],site:[2,28,11],motiv:[2,9,10,21,1],prose:13,incom:2,revis:28,cafemochadecaf:20,whatihav:37,bolder:1,mousemovelist:12,began:[21,1],classpath:[33,10,1],cross:[2,13,10],member:[28,1,29,2,32,23],python:[1,2,4,6,7,8,9,10,11,12,13,14,15,18,19,20,21,28,23,22,30,29,31,33,34,35],tendenc:28,fill:[10,28],infer:33,difficult:[21,10,12,2,28,33,20],competit:29,detect_cpu:31,original_new:22,denot:33,expans:[10,12],drink:20,upon:[32,10,8,28,18],effect:[28,11,1,12,29,4,23,18,22,37,20],coffe:[9,20],handi:29,issuccess:11,tribut:23,pdf:[2,7,13,9],canva:36,php:29,misappl:28,pull:[7,28,10,14,6],closenotifi:29,center:10,albin:28,firstli:20,weapon:32,nonetheless:8,well:[21,10,1,29,2,28,13,5,36,18,8,20],difflib:6,numerical_integr:11,thought:[21,28,11,30,22,16],scissor:23,weblog:[8,18],exampl:[0,1,2,4,6,7,8,9,10,11,12,13,14,18,20,21,28,23,22,30,29,32,33,35,36,37,38],command:[9,10,0,1,15,33,11,6,7],setq:7,choos:[9,10,11,1,2,4,28,18,7,14,20],breaker:21,usual:[21,10,0,1,28,33,5,18,8],test1:[10,1],run_ev:18,ccolor:29,test2:[10,1],test4:10,flesh:10,hybrid:10,heavili:[16,28],skill:11,simultan:[7,28],gliffi:13,web:[2,33],penchant:33,newbrain:11,field:[9,10,1,12,13,33,18,29],bell:[10,28,18],makefil:[10,14,1,30],knew:[1,18],proxydemo2:35,add:[1,2,4,6,7,8,10,11,12,13,14,15,17,18,20,21,28,23,22,29,32,33,35,36],jython_hom:10,wet:20,collis:36,ought:12,match:[32,28,11,23,29],confront:22,jython:[9,10,14,18],royalti:[2,10],elementat:36,fate:28,sumvalu:28,caller:[28,4,18],piec:[21,22,28,6],arguabl:[10,28],testa:1,camelcas:13,testb:1,know:[10,1,29,2,8,28,23,13,7,14],press:[33,10],redesign:28,height:[36,29],recurs:[28,11,4],insert:[33,22,28,6,18],trash:[21,9,28],resid:33,like:[1,2,4,7,8,10,11,12,13,16,17,18,20,21,23,28,30,29,32,33,35,36],lost:[10,28],incred:33,paperbin:28,necessari:[28,0,1,12,10,33,35,37,7],martin:[28,8],resiz:[33,0],boxdesc:29,page:[7,9,11,8,33],poor:28,sum:[33,28],trashbin:28,captur:[10,8],suppli:10,phenomena:29,cafemochaextraespresso:20,growth:20,"export":[7,10],superclass:10,flush:1,proper:[10,28,12],home:[7,10],peter:29,simple1:18,librari:[9,10,11,1,29,31,37,16,33,5,18],simple2:[33,18],tmp:1,"__setattr__":22,trust:1,leaf:18,lead:21,developerguid:14,avoid:[7,21,28],doublevalu:28,slide:17,overlap:29,jeremi:36,itemnotavail:12,troup:33,getnam:[28,1],trap:12,hinder:33,weslei:[28,11],slower:[21,10],investig:36,usag:[21,9,28,1],facilit:[28,29],host:[2,7],arg1:[33,8],although:[21,10,28,1,2,4,13,5,7,8],offset:29,beneath:0,panel:29,about:[21,9,10,28,1,12,31,2,8,4,23,16,13,36,18,7,37,14,20,33],quarter:12,rare:21,column:29,purist:28,javaclass:10,mindviewinc:[],bridg:10,constructor:[9,10,0,1,12,29,4,33,28,18,22,8],wxcommandev:29,"0076b7ac":22,own:[21,10,29,1,12,2,15,4,23,33,28,34,35,6,18,7,22,14,20,36],fillov:36,bashrc:10,automat:[9,10,11,1,12,13,15,4,33,28,35,5,6,18,7,29,37,30],guard:21,getpric:12,awhil:21,rectifi:[28,8],pitfal:33,forget:28,mere:10,leverag:[10,18],prozac:12,val:[33,22,10,28,29],transfer:[9,5,12],inner:[9,10,1,29,28,37,38,22,8],transitiona:12,maze:[9,36],stai:[21,28,11],arg2:[33,8],"function":[9,10,11,1,12,33,3,29,4,23,16,28,5,18,32,7,22,8],mailer:7,imatix:12,pythontojavaclass:10,subscrib:21,triangular:18,bodi:[33,28,11,8],measur:13,kungfugui:4,highest:7,eat:32,count:[33,1,12],made:[10,12,29,30,13,28],cleanup:1,newval:28,whether:[28,11,29,12,2,10,18,36],wish:[10,1,20],scroll:10,dynatrash:28,distract:10,record:36,below:[7,10,11,29,20],limit:[33,10,8,22,18],testfil:6,trepid:8,otherwis:[21,28,11,1,29,2,18],problem:[21,33,10,11,1,12,3,29,4,23,16,28,35,18,32,22,37,8,20],jdialog:10,evalu:12,"int":[28,12,1,29,31,10,14,36],rather:[33,10,1,29,31,13,32,4,16,28,35,18,37,8,20],dure:[10,1,12,2,28,16,35,8],twist:28,implement:[21,9,10,11,1,12,32,4,33,28,35,36,18,29,37,8,20],decorator_function_with_argu:8,ing:18,eric:[35,29],probabl:[21,10,11,29,13,28,23,33,35,5,18,8],typemapadapt:28,inevit:28,entry_exit_funct:8,detail:[21,9,28,11,29,31,32,22,7],virtual:[28,0,12,32,4,33,35,7],preinstal:7,book:[21,9,28,0,1,2,8,4,33,13,11,17,18,32,7,22,37,14,36,19],lookup:[32,23],futur:[2,10],rememb:[33,10,28,23],bazzar:13,repeat:[21,11,29,4,7,20],star:22,fulli:33,multipledispatch:23,cafelatteextraespressowhip:20,singleton:[21,9,22,18,12,37],lightoff:[10,18],vein:8,typenum:28,experienc:33,sphinx:[9,30,2,13,7,14],interp1:10,came:[16,21,28],indirectli:28,rule:[21,9,10,1,13,33],getreturntyp:1,portion:1,klass:[22,29,18],cookbook:18},titles:["Building Application Frameworks","Unit Testing &amp; Test-Driven Development","Introduction","Coroutines &amp; Concurrency","Factory: Encapsulating Object Creation","Messenger/Data Transfer Object","Comprehensions","Developer Guide","Decorators","Python 3 Patterns, Recipes and Idioms","Jython","Function Objects","StateMachine","Book Development Rules","ToDo List","A Canonical Form for Command-Line Programs","Iterators: Decoupling Algorithms from Containers","Teaching Support","Metaclasses","A Note To Readers","Decorator: Dynamic Type Selection","The Pattern Concept","The Singleton","Multiple Dispatching","Part I: Foundations","Part II: Idioms","Part III: Patterns","Generators, Iterators, and Itertools","Pattern Refactoring","Observer","Contributors","Discovering the Details About Your Platform","Visitor","Quick Python for Programmers","Python 3 Language Changes","Fronting for an Implementation","Projects","Changing the Interface","Table-Driven Code: Configuration Flexibility"],modules:{},descrefs:{},filenames:["AppFrameworks","UnitTesting","Introduction","CoroutinesAndConcurrency","Factory","Messenger","Comprehensions","DeveloperGuide","PythonDecorators","index","Jython","FunctionObjects","StateMachine","Rules","ToDo","CanonicalScript","Iterators","TeachingSupport","Metaclasses","NoteToReaders","Decorator","PatternConcept","Singleton","MultipleDispatching","Part1","Part2","Part3","GeneratorsIterators","PatternRefactoring","Observer","Contributors","MachineDiscovery","Visitor","QuickPython","LanguageChanges","Fronting","Projects","ChangeInterface","TableDriven"]})
+Search.setIndex({desctypes:{},terms:{defaultcloseoper:10,orthogon:21,yellow:[30,18],four:[13,18,12,36],secondli:20,prefix:30,sleep:[36,30],dirnam:[1,6],"00798f9c":28,browse_thread:7,gladiolu:32,evalscissor:23,whose:[16,22,11,23,30],authorit:18,typeerror:18,pprint:18,selen:7,concret:[22,1,4],swap:[35,30],under:[21,10,11,1,12,2,16,35,7],testabl:1,worth:[22,10,4,18],lure:12,everi:[21,33,10,1,12,2,4,16,22,30,14,20],risk:29,inventfeatur:32,matchobj:6,rise:21,lurk:10,voic:[2,13,1],penchant:33,decorator_without_argu:14,govern:12,affect:[22,30],rare:21,vast:18,disturb:[22,4],nestedshapefactori:4,metaclass:[9,28,14,18],decorator_with_argu:14,correct:[10,22,12],"__templatemethod":0,getdeclaredmethod:1,technolog:[13,1],verif:1,unpredictableperson:12,cappuccinowhip:20,c02:1,categori:[21,14,30],cmp:[18,12],storag:28,"10f":22,direct:[21,9,10,12,4,14,36],sourceforg:[10,30],nail:22,second:[33,10,11,30,28,23,16,22,35,14],classcastexcept:16,ill:22,"__finditem__":10,even:[10,11,1,13,28,33,19,35,18,7,22,14,20],hide:[21,22,37],createshap:4,canvasheight:36,item1:23,weren:28,shallowai:11,firstdigit:12,"new":[0,1,2,3,4,6,7,8,10,11,12,13,15,16,18,20,21,23,22,32,33,36],net:[10,1,30,2,13,7],ever:[16,22,23],succumb:1,liberti:37,told:4,getsiz:30,widget:30,behavior:[21,10,11,30,12,28,23,16,22,18,37,14,36],never:[2,28,10,22,1],here:[1,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,28,30,31,33,36,37],"__hash__":12,debugg:7,gridlayout:30,path:[22,1,12,10,6,7,30],cardboard:22,interpret:[21,9,10,11,22],dry:20,sweeet:7,haschang:[30,12],credit:[13,9],errmsg:1,studi:[21,22,1,30,4,18],readlinesetup:10,portabl:[10,4],tremend:10,golden:21,argin4:10,"_test":6,brought:[7,33,10],substr:22,unix:31,ratsandmaz:36,wateron:[10,18],total:[10,22,12],unit:[9,10,1],getchar:10,plot:30,redon:13,describ:[21,33,10,1,12,2,32,22,16,35,5,18,7,20],would:[33,10,0,1,12,2,30,4,16,22,11,17,28,14,20],quickpython:33,suit:1,call:[21,9,10,0,1,12,33,32,30,4,23,16,22,11,6,18,7,28,37,14,35],typo:13,recommend:22,type:[21,9,10,11,1,12,33,32,30,4,23,16,22,18,7,28,37,20],until:[21,10,11,12,32,22,33,6,19,14],looni:11,remark:[33,10,22],relat:[21,35],notic:[10,1,30,32,23,4,33,22,14],hurt:30,warn:[21,10,8,22],glass:22,flowervisitor:32,moin:14,hole:1,hold:[10,11,12,13,22,16],unpack:[10,22],must:[10,11,1,12,2,32,30,4,23,33,22,5,36,18,7,28,37,14,20],join:[10,6,18],err:[22,1],setup:[7,1,4],work:[21,9,10,22,1,30,33,2,8,4,23,16,13,35,6,18,7,28,14,20,19],worm:32,contentpan:10,root:[22,1],overrid:[22,0,1,12,33,18,7,30],walk_comprehens:10,give:[21,10,1,31,2,22,33,13,18,7,14,36],digit:12,indic:[9,10,30,12,22,4,33,29,14],doublevalu:22,lighton:[10,18],setvis:[10,36,30],unavail:12,unassign:7,david:[21,33,18],addtobin:22,end:[21,10,11,30,2,23,33,13,18,22,8,36],quot:33,ordinari:[22,1,30,10,4,18],classifi:[21,9],revisit:[22,4],how:[21,33,10,11,1,30,2,32,15,4,23,16,13,7,28,22,20],hot:20,disappear:[19,36],env:1,answer:[7,22,1,23],verifi:[10,1],changeinterfac:37,perspect:[21,22],"void":[10,1],updat:[30,29,6,7,8,36],my_new:28,recogn:[],lai:1,mess:2,coffeeshop:20,after:[21,10,11,1,12,8,28,33,22,36,18,7,14,20],implementation1:35,lump:35,implementation2:35,diagram:[9,22,12,13,35,7,8,20],befor:[21,33,10,11,1,12,2,22,16,18,30,14,20],wrong:[22,10,1],beauti:[22,35],law:21,parallel:[21,3],demonstr:[10,0,1,30,12,32,23,33,35],beanmeup:20,chere:7,profess:17,attempt:[21,22,1],third:22,classmethod:[28,18],revolv:21,exclud:1,wink:0,maintain:[21,22,11,12,13,23,36,14,20],environ:[7,32,22,4,31],incorpor:[10,11,14,1],enter:[10,14,30,12,36],lambda:[10,18],someplac:7,order:[33,10,0,30,12,2,4,16,22,11,5,18,7,8,20,35],origin:[10,1,30,14,22,16,36,8,20],composit:21,os_walk_comprehens:6,over:[21,33,10,11,1,2,22,16,18,14],fall:[14,1,31],orang:30,becaus:[21,33,10,22,1,12,2,32,28,16,13,35,18,7,30,37,14,19],run_ev:18,paperscissorsrock:[32,23],flexibl:[21,9,10,11,12,23,33,22,18,38,20],vari:[21,11],fit:[21,22,11,1,30,2,35],fix:[28,29,30,13,32,22,7,8,20],avocado:20,"__class__":[10,11,32,23,18,20],bytecod:10,better:[21,10,11,1,12,2,22,13,30,14],imp:[16,35],blemang:33,comprehens:[9,10,6,18],hidden:[33,22,0,35],schmidt:22,easier:[21,10,1,12,32,5,18,7,30,14],glassbin:22,them:[21,33,10,11,1,30,2,32,23,16,13,36,6,7,22,14,20,17],thei:[21,33,10,11,1,12,2,32,37,28,16,13,6,18,30,22,14,20],proce:7,safe:[16,9,10,14],stringformat:33,"break":[22,1,29,20,36,6],promis:22,setvalu:22,"instanceof":22,choic:[22,11,30,2,32,4,23,13,36,18,7,20],grammat:2,alex:28,brough:[],getvalu:[10,22,12],closeobserv:30,each:[21,9,10,0,1,12,32,30,4,23,33,22,11,36,6,18,28,8,20,35],debug:[10,8,29],side:[7,13,10,22,1],mean:[21,33,10,11,1,12,13,32,22,16,35,18,30,14,20],prohibit:22,setdefaultcloseoper:[10,30],nochang:12,enorm:14,arduou:20,taught:11,makecharact:4,receptacl:22,collector:10,whip:20,goe:[13,33,22,20],langug:10,gof:[21,11,35],content:22,rewrit:[10,2,8,22,16,13,35,37,7,14,20],dsl:10,vector:[21,22,36,12],adapt:[7,9,22,37],reader:[9,1,13,16,33,5,19],got:[13,1,37],washer:12,forth:10,dsc:18,linear:21,barrier:21,written:[33,30,11,1,18],situat:[28,1,10,33,22,18],free:[7,13,21,12],standard:[21,10,11,1,30,33,14],ncpu:31,println:[22,10,1],mousemovegener:12,quickinstal:7,sheet:[7,1],kit:10,acrobat:7,uiuc:22,puzzl:4,angl:21,openssh:7,filter:18,mvc:30,isn:[21,10,0,30,2,22,33,35],subtl:[21,22],onto:21,bite:1,rang:[10,0,30,32,4,23,33],isassignablefrom:1,gradi:22,hoop:14,independ:[21,22,30,18],wast:[33,4,30],system:[21,10,11,1,12,31,2,32,15,4,23,13,18,7,22,36,19],restrict:[2,10,14,28,30],"__tojava__":10,unlik:[33,22,11,1],alreadi:[21,10,11,1,30,2,22,16,18,7,36],wrapper:[10,22],wasn:22,getmemb:6,thick:4,agre:33,primari:[22,11,1,3,18,32],hood:10,brillig:10,vendingmachinetest:12,metanewvsinit:18,"__implement":35,spinach:20,top:20,sometim:[21,10,0,37,13,22,18,7,14],cardboardbin:22,rsrc:30,gnureadlin:10,master:[10,22,12],too:[21,10,1,13,22,34,19,14,20],similarli:10,john:18,consol:[10,1],namespac:18,tool:[9,10,11,1,12,2,4,13,7,30,22,8],propon:22,getcontentpan:30,somewhat:2,conserv:18,technic:13,trek:28,silli:22,target:[10,30],keyword:[33,30,10,4,18],provid:[21,33,10,0,1,12,30,4,16,22,11,37,7,28,14,20,35],"__onlyon":28,tree:[10,1],hors:33,prong:22,project:[21,9,10,1,2,32,22,13,17,7,8,36],matter:[21,22,11,13,4,18],pressur:1,foamedmilk:20,fashion:[33,22,14],mind:[13,28,1,6],mine:7,raw:33,aforement:21,cohes:[21,22],"__main__":[28,1,30,10,33,6,18],seen:[21,33,10,11,30,12,2,4,16,35,18,14],seem:[21,10,1,12,14,4,33,22,35,8],seek:[22,12],seminar:2,innerclass:10,realm:[16,21],respectjavaaccess:10,terrif:10,latter:[21,10],cope:22,thorough:10,alreadyopen:30,staticinnerclass:10,client:[22,0,1,12,2,35,37],alldecor:20,thoroughli:2,wherebi:12,simplifi:[7,28,10,4,18],shall:[10,11,1],bruce:7,glob:[10,1],object:[1,4,5,8,9,10,11,12,14,16,18,36,21,28,23,22,30,32,33,35,20,37],deleg:[28,35,22],regular:[33,10,1,20],letter:0,phase:[21,22,14],coin:11,brien:22,tradit:21,simplic:[21,32,10,12,33],don:[21,9,10,22,37,30,2,3,4,23,33,13,34,35,18,7,14,19],simplif:[10,18],pythoninterpreterset:10,doc:7,flow:[13,10],doe:[21,10,11,1,12,8,30,4,33,22,0,18,28,14,29,35],bash_profil:7,dummi:11,declar:[33,1,18],wildcard:10,itemslot:12,notion:35,dot:10,marvel:33,has_kei:[22,4,12,31],class_nam:18,endear:10,visitor:[21,9,22,1,30,32],"__str__":[28,11,12,32,23,18],random:[21,22,30,32,4,23],syntax:[10,1,28,33,22,5,18,14],"2008v1":7,involv:[21,28,15,22,16,18,7],despit:22,layout:[2,13,10],acquir:30,menu:[7,15,4,20],explain:[35,14,1,18,4],configur:[9,10,30,12,13,23,22,18,7,38],restaur:20,sugar:14,theme:11,busi:32,"__call__":[28,11,14,18],priveledg:[],oct:10,edict:32,cappuccino:20,vener:7,stop:[22,1],next:[10,11,1,12,4,16,22,18,28,36],on_mouseup:30,report:[7,1,36],rosettacod:11,bat:10,bar:[13,3,28,18],isopen:30,emb:[33,10],baz:[3,18],shape:[22,4,18],method:[21,9,10,0,1,12,32,30,4,23,33,22,11,6,18,28,37,14,20,35],twice:[1,30],bad:[13,4],steam:20,fair:11,decoratortalk:14,elimin:[10,22],mandatori:21,result:[21,33,10,11,1,30,22,16,6,18,14,20,36],respons:[9,22,0,12,33,11,36,20],fail:[22,10,14,1,12],themselv:[21,33,30],bee:[32,35,30],hammer:22,best:[21,10,2,33,13,7,14],brazil:2,awar:[22,10,30,4,18],said:2,alsum:22,databas:28,hgrc:7,red3d:36,discoveri:[21,22],figur:[2,13,10,22,31],emptor:19,simplest:[21,28,10,1,30],awai:[21,22,20,12],getkei:10,approach:[21,9,10,30,12,32,4,16,22,18,7,28,37,14,20],attribut:[21,10,2,5,18,14],accord:[16,22,1],extend:[16,32,22,1,4],xrang:10,weak:33,extens:[7,13,10,22,18],lazi:[28,35,12],preprocessor:14,backgroundcolor:30,rtti:[9,22],aparat:22,protect:[10,35,1,30],accident:[21,22],expos:[22,37],howev:[21,33,10,11,1,12,13,32,30,4,16,22,35,5,36,18,7,28,37,14,20],pitt:14,against:[32,10,14,22],logic:[21,30,20],countri:11,com:[21,10,1,12,13,22,16,18,7,14,36],con:20,compromis:[9,20],kwd:28,notifyobserv:30,elf:32,excess:12,coconut:33,"2nd":10,diff:7,guid:[7,9],assum:[7,33,28,22],panel:30,duplic:[21,6],light:[10,18],testsynchron:30,ianbick:18,three:[21,10,12,32,18,14,20],been:[21,10,22,30,12,2,28,33,13,35,18,19,14],chrysanthemum:32,much:[21,10,22,1,30,2,3,4,33,13,18,32,7,14,19],interest:[21,10,1,30,2,28,22,18,14],basic:[21,9,10,1,12,2,4,33,16,22,35,18,30,37,14,20],"__doc__":6,"__len__":10,quickli:[10,12],life:30,mcl:18,deeper:[22,10,4],spit:18,getval:10,xxx:31,isfunct:6,dave:16,alreadyclos:30,bookstor:2,ugli:[22,37],exception:[33,10],ident:[28,37,22,12],occam:21,gnu:1,servic:[2,13],properti:10,commerci:[13,10],air:[4,12],employ:2,calcul:[11,30],aid:33,vagu:21,dizzi:21,enlev:21,seconddigit:12,player:30,kwarg:[5,6],indent:[13,33,6],tediou:[10,30],sever:[22,10,4,12],valgen:10,quand:21,perform:[21,10,11,1,12,32,4,23,22,0,18,30,14,20],suggest:[21,28,1,13,22,33,7],make:[1,2,4,5,6,7,8,9,10,11,12,13,14,17,18,20,21,22,23,28,29,30,32,33,35],transpar:[10,1,20],complex:[9,10,11,1,30,4,6,14],descend:1,tackl:22,complet:[21,10,1,12,22,35,7,30,14,36],inheritor:[30,18],blue:[30,18],listperform:38,hand:[21,33,28,11,30,13,4,16,22,18,14],fairli:[21,22,1,30,10,23,18],nix:10,rais:[2,22,18,12],garlic:20,refin:[10,8,22],techniqu:[28,3,22,4,16,32],qualif:10,jframe:[10,30],kept:[2,1],thu:[21,33,10,11,1,12,4,23,16,22,0,18,14,20],getbyt:36,game:[4,30],inherit:[21,9,10,11,1,12,30,4,33,22,0,18,28,20],runtimeexcept:[16,12],academia:11,shortli:[33,1],greatest:[21,22],thi:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,18,19,20,21,22,23,28,29,30,32,33,34,35,36,37],programm:[21,9,10,0,1,12,2,28,33,35,37,14],everyth:[10,30,31,2,22,33,13,18,19,14],isomorph:21,left:[21,22,30,13,32,15,6,7],agon:2,identifi:[7,33,10,4],setcolor:[36,30],just:[1,2,4,5,6,7,14,10,11,12,13,18,19,20,21,22,23,28,30,31,33,35],"__dict__":[28,5,6,30],kdiff3:7,yet:[33,10,1,30,13,28,16,22,6,18,19,36],languag:[21,9,10,11,1,12,3,4,33,22,34,6,18,14,29],previous:[22,4,18],easi:[21,10,1,23,33,22,7,20],had:[21,33,10,11,1,12,2,32,22,16,36,14,20],keyset:[10,22],spread:[4,23],prison:36,falter:1,els:[21,10,1,12,31,28,33,22,6,7,36],functionobject:11,explanatori:10,gave:[2,22],applic:[21,9,10,0,12,4,35,7,14],larman:37,mayb:[13,8,1],metabas:18,ajout:21,background:30,elabor:22,shadow:21,unten:14,readlineconsol:10,apart:21,maxval:10,specif:[21,10,11,1,12,4,16,22,35,18,7,30,8],arbitrari:[33,22],nudg:0,hunt:[22,30,18,36],manual:[22,23],doubledispatch:22,tymciurak:7,night:[2,10,18],ocbox:30,unnecessari:[10,35,4,12],singletonpattern:28,underli:21,www:[21,33,10,11,1,12,22,16,18,7,30,14,36],right:[21,10,30,2,22,33,13,6,18,7,19],old:22,deal:[22,10,23,37],printf:33,interp:10,somehow:[10,35,22,18],dead:36,intern:[16,22,1,4],borg:28,unless:[2,35,1,6],indirect:22,successfulli:[7,22,1],atteint:21,txt:[36,12],clash:22,bottom:[33,11],test_x_z:18,suffici:10,condit:[9,11,1,12,4,33,36],foo:[10,13,3,28,33,18,14],core:[7,33,10],sensibl:[4,18,23],steamedmilk:20,confer:[2,13,22],promot:[2,22],repositori:2,pylist:10,post:[7,14],"super":[33,28,30,18],create_mc:18,meyer:36,chapter:[33,10,11,1,2,8,22,16,13,34,36,18,38,14,20],unpackag:10,alexand:16,eat:32,getparametertyp:1,slightli:[9,1,12,5,18,30,14],py2float:10,surround:[33,22,36,30],unfortun:10,commit:[7,8],produc:[21,10,22,1,12,2,32,4,23,16,13,18,37,14],makeobstacl:4,dilemma:[32,22],thermostat:[10,18],javac:10,curiou:19,basenam:6,"float":10,encod:23,bound:[2,32,10,22],mocha:20,down:[10,11,1,30,4,36,20],creativ:[2,22,17],weightvisitor:22,bizarr:14,cappuccinodecafwhip:20,wrap:[10,11,30,28,16,22,14,20],opportun:22,clearchang:30,javax:10,testdumpclassinfo:10,east:36,accordingli:13,wai:[1,2,4,5,7,14,10,11,12,13,18,20,21,22,28,29,30,31,32,33,35,37],frustrat:10,support:[9,10,1,12,2,3,4,33,22,17,7,30],evalpap:23,why:[21,33,22,14,18],avail:[21,10,11,1,2,22,33,18],stuck:1,reli:[16,22,5],editor:[7,13],fork:7,head:[21,11],medium:21,autonom:36,form:[21,9,22,1,30,2,15,4,16,33,18],offer:20,forc:[21,33,10,1,30,2,4,16,35,6,18],forg:1,heat:12,hear:1,percentag:2,heap:[22,35],hashtabl:[],"true":[22,1,12,10,4,33,18],analyst:22,"6dd415847e5cbf7c":7,entryexit:14,pragu:22,setsuccess:11,maximum:[21,33],tell:[10,11,1,12,4,33,22,7,36],singletonmetaclass:28,absenc:1,fundament:[11,21,0,1,33],trim:22,developerwork:18,classif:21,featur:[21,10,1,2,15,22,33,34,7,14],setxi:36,semicolon:33,classic:[22,12],howdi:[10,18],stronger:33,"abstract":[21,9,22,4,37],flaw:1,sale:2,exist:[22,0,4,16,6,18],door:12,cleverli:13,mold:[22,37],trip:2,assembl:20,inde:[28,10,22,14,1],surpris:[33,14],metamethod:[9,18],excel:[16,18],refactor:[9,22,1,29],tij:38,test:[21,9,10,11,1,12,22,19,6,18,7,30,8],tie:21,appetit:21,smell:12,realiti:10,getsizetupl:30,notif:[21,30],intend:[2,10,1],felt:10,intent:[16,21,32],consid:[21,9,10,11,1,23,22,35,36,18,14,20],phthaloblu:18,bitbucket:[7,9,8,29],receiv:[10,14,30],longer:[10,13,22,33,14,20],furthermor:11,home:[7,10],intimaci:22,ignor:[22,28,1,18],inexpens:22,time:[21,33,10,0,1,12,2,30,4,16,13,11,36,18,28,22,14,20],push:7,backward:[36,29],osx:[7,31],concept:[21,9,10,0,11],chain:[9,11,12],nextstat:12,skip:1,consum:[10,5,20],focus:4,invent:[10,35],cafelattedecaf:20,objcount:1,subclass:[9,10,12,4,22,18,20],primer:18,milk:20,row:[30,12],decid:[22,12,30,32,10,4,33,35,20],depend:[21,10,30,12,4,22,18,8,29],decim:33,intermedi:2,certainli:[21,22,30,12,10,4,35,20],decis:[13,16,36,33],jvm:10,mainloop:30,jtextarea:10,isinst:[16,18,31],"__metaclass__":[28,18],sourc:[21,10,1,12,2,22,13,7,30,36],string:[9,10,11,1,12,4,33,22,18,30,36],brazillian:2,onlyon:28,"fa\u00e7ad":[9,37],broadli:22,word:[10,11,1,12,0,37,14],exact:[22,4,12,23],valuabl:22,level:[21,22,1,30,4,33,6,18,14],did:[33,10,6],die:36,gui:[0,4,30],iter:[21,9,10,1,12,4,33,16,22,27],vein:14,item:[30,10,4,12,23],team:[2,7,29,9],quick:[9,10,1,33,7,20],round:[35,18],dir:[10,1,18,6],dict:[28,10,5,6,18],prevent:[9,22,1,30,4,35,18],plaincap:20,paintcompon:30,htm:36,compens:21,sign:[7,10,8],bondag:14,cost:[21,20,12],cafelattewetwhip:20,patient:10,corba:10,appear:[21,10,11,1,12,13,8,30,4,33,22,18,28,14,29],filler:22,scaffold:4,current:[21,33,10,1,12,22,16,8,36],suspect:4,newalgorithm:11,shapefact2:4,deriv:[22,1,12,10,4,33,35,18,30],cappuccinodri:20,gener:[1,2,4,6,7,8,9,10,11,12,14,16,18,36,21,28,23,27,22,29,30,32,33,35,37],satisfi:[21,22,11,12,35],modif:[33,22,14,20,18],chainlink:11,address:35,along:[21,33,10,1,12,22,16,35],viabl:21,teacher:17,wait:[30,10,22,12],box:[9,10,1,30,4],messengeridiom:5,nextb:12,alti:30,shift:6,queue:11,behav:[10,14,22,12],extrem:[7,22,10,14,1],commonli:[10,22],nmspc:18,trashtyp:22,semant:[33,1],regardless:[22,35],mazegen:36,extra:[22,1,30,33,18,20],activ:[13,32,22,4],modul:[9,10,30,3,33,18,14],prefer:[13,18],toarrai:10,visibl:10,codemark:6,instal:[9,10,1,30,22,7],forefront:1,gsum:22,anounc:7,red:[30,18,36],newslett:21,prove:[22,14],univers:[21,4],visit:[32,10,22],recycleap:22,subvers:10,everybodi:30,live:10,handler:30,msg:33,scope:33,checkout:[7,8],testid:1,trustworthi:6,capit:18,testpyutil:10,afford:11,peopl:[21,22,1,29,2,32,33,13,17,18,7,14],claus:[33,30,4,12],clue:22,visual:[7,9,30,13],appendix:2,rigid:10,oop:[21,22,1,30],examin:[10,22],obj:[16,33],jlabel:10,effort:[9,10,11,1,2,22,17],easiest:[7,9,10,32],simplemeta2:18,simplemeta3:18,fly:32,graphic:[36,1,30,4],ibm:18,prepar:14,dmitri:28,battl:[32,4],focu:[13,3,22],flowlayout:10,problemsolv:11,can:[1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21,22,23,28,30,32,33,35,36,37],purpos:[21,22,11,4],problemat:16,claim:11,encapsul:[21,9,22,11,12,4],stream:10,predict:14,wrapped_f:14,statet:12,backslash:[33,10],topic:[2,33,28],heard:22,chih:28,abort:[1,6],proxydemo:35,recycl:[9,22],simul:[21,9,22],occur:[21,22,11,1,12,13,4,23,30],pink:30,alwai:[21,28,0,1,29,10,33,22,8],killanddismemb:4,variou:[21,10,11,1,12,32,4,23,22,0,20],distinctli:12,ping:10,write:[21,9,10,0,1,12,2,4,33,16,13,11,6,18,30,22,35],anyon:[2,36],pure:[10,12],"0x00798900":28,parameter:22,ensconc:10,map:[10,12,32,22,33,36],product:[13,33,10,1],modal:10,book:[21,9,28,0,1,2,8,37,4,33,13,11,17,18,32,7,22,14,36,19],max:30,thermostatdai:[10,18],spot:[13,4],usabl:12,wantmor:12,inputb:12,inputc:12,mac:7,inputa:12,mymethod:30,aop:14,mai:[21,33,10,11,1,12,2,30,4,16,13,34,36,7,28,22,20],underscor:[13,33,28],data:[9,10,11,30,12,4,33,16,22,5,28],grow:34,newlin:33,my_login:7,practic:[33,18],johnson:21,secur:[10,14],explicit:[21,11,14,23],cafelattewhip:20,inform:[10,11,1,12,31,8,30,4,23,33,22,5,18,7,28,14,36],"switch":[22,11,36,35],preced:20,combin:[9,10,11,30,2,23,18,20],gamma:21,callabl:[14,30,18],talk:[7,21,10,22],vike:33,extractor:[8,1],dojo:17,mouseact:12,countobserv:30,greenhouselanguag:[10,18],brain:[33,11],lst:10,codemanag:[6,18],still:[21,10,22,30,12,2,4,33,13,6,18,7,8],skeleton:35,stringlist:22,dynam:[21,9,10,11,30,32,4,23,33,22,35,14,20],rosetta:17,group:[21,22,11,30,2,32,33,6,18,7,36,17],thank:[9,29],polici:0,jim:[22,11],platform:[9,10,31],window:[9,10,31,13,15,7,8],curli:33,borgsingleton:28,jtextfield:10,ddtrash:22,non:[21,10,1,2,22,33,18],dispens:12,halt:1,halv:33,sysconf_nam:31,alist:7,initi:[21,10,0,30,12,4,33,22,35,18,7,28,8,36],sorter:22,underneath:7,typedbinmemb:22,pyinteg:10,aesthet:22,therebi:1,half:35,javaclassinpython:10,now:[21,10,1,12,32,4,22,36,18,7,14,29],discuss:[21,22,36],introduct:[9,2,33,18,7,14],term:[21,22,11,1,12,35,37,14],name:[21,10,0,1,12,13,8,30,4,23,33,22,35,5,6,18,7,28,14,20],ppr:22,getweapon:32,didn:[21,33,8,1],oliv:20,phyast:14,separ:[21,10,0,1,12,32,4,33,22,11,18,7,30,35],rock:23,cafemochadecafwhip:20,pizza:20,jmap:10,compil:[21,10,11,1,30,22,33,35,6,18,19,14],domain:10,replac:[10,11,1,13,32,33,14],individu:[7,22,36,20],arg3:14,continu:[22,1,12,10,33,6],tag3_method:18,ensur:[7,21,35,1,6],parsetrash:22,significantli:14,begun:21,year:[16,21,22,1],happen:[21,10,22,1,12,2,4,13,18,30,14,20],dispos:10,troll:32,shown:[21,22,11,32,10,4,33,20],accomplish:[22,37,30,10,33,35,18,28],cafemochawhip:20,"3rd":[16,20],space:[22,13,10,33,35,6,36],profit:[2,10],antoin:21,profil:10,internet:[1,36],returnstr:10,factori:[21,9,22,12,4,37],"0x7ed70":18,earlier:22,"goto":22,occupi:33,getcwd:1,argu:[13,3,16,14,21],argv:6,lab:22,org:[10,11,1,30,14,33,29,18,7,8],"byte":[10,36],care:[13,33,22,4],reusabl:[16,22],couldn:[22,11,1],yarko:[7,8,29],synchron:30,recov:22,thing:[21,10,11,1,30,2,23,33,13,35,18,7,22,14],place:[33,10,22,1,12,2,4,16,13,5,17,7,30,14,20,19],greenhous:[38,10,18],principl:[21,9,22,1,12,37],think:[21,33,10,11,1,30,2,23,16,22,7,14,20],frequent:22,first:[21,9,10,0,1,12,33,30,4,23,16,22,35,6,18,7,28,37,14,20,36],oper:[21,9,10,11,33,12,32,15,4,23,16,22,18,7,14],directli:[28,0,1,2,10,33,22,18],carri:[22,11,12],onc:[21,10,30,22,6,18,7,14,20],arrai:[21,22,12,10,4,33,37,36],getcost:20,crib:31,yourself:[10,12,2,22,33,7],fast:[13,33,10,1],ring:[10,18],open:[10,0,1,12,2,22,13,6,18,7,30],size:[2,30,10,1,20],given:[22,0,12,30,10,4,35,36],ian:18,"__subclasses__":[32,4,23],convent:18,width:[36,30],teardown:1,caught:12,clip1:22,plastic:22,necessarili:[13,0],circl:[18,4,12],showdigit:12,white:[9,22,1,30],conveni:[28,30,13,10,4,35,18,20],cite:36,includ:[21,33,10,1,12,15,28,16,22,17,7,30,14,20,29],simionato:[14,18],changeneighbor:30,especi:[21,22,29,10,33,17],copi:[22,12,30,2,35,6,7],specifi:[10,1,12,2,4,33,7],broadcast:12,newcolor:30,enclos:20,enigma:22,changeavail:12,registerleafclass:18,holder:22,than:[21,33,10,11,1,30,13,32,4,23,16,22,35,18,14,20],png:7,serv:[21,4],setattr:28,min:30,applet:0,were:[10,1,12,4,33,22,18,14],posit:[36,30],surrog:[11,37,20,35],seri:14,analysi:21,sai:[21,33,10,11,30,12,13,32,23,16,22,0,6,18,7,14],jythonc:10,nicer:[7,37,30],svnroot:10,argument:[21,9,10,11,1,12,4,33,22,5,18,30,14],ant:10,prt:10,larri:22,deliv:10,breakfast:30,kevin:30,leastsquar:11,engin:[32,0,1],squar:[30,4,18],patternrefactor:[22,11],note:[1,4,6,7,14,9,10,11,12,13,15,16,18,19,20,21,22,28,29,30,33,34,35,36],altogeth:[21,22],ideal:10,take:[21,33,10,0,1,12,2,32,30,4,16,22,11,18,7,28,37,14,20,29],green:[30,18],wonder:18,noth:[21,22,11,1,30,13,36],basi:[1,30],begin:[21,10,29,13,22,33,7,14],sure:[2,33,10],trace:[14,1,30],normal:[21,28,11,1,32,4,33,22,18],track:[22,12,30,2,35,5],price:[2,22,20,12],setchang:30,beta:10,wire:[28,22],pair:[22,37],neatli:35,televis:28,latex:[7,13,8,29],synonym:21,later:[21,10,11,1,4,22,18,7,28,14,20],drive:0,quantiti:[30,28,22,12],addbranch:7,runtim:[9,10,11,4],parseint:30,quiescent:12,shop:[2,20],shot:[22,20],linedata:11,show:[21,33,10,11,1,13,3,15,4,16,22,6,18,7,28,14],cheat:7,cheap:[21,22],subprocess:10,mousetrap2test:12,concurr:[3,9],permiss:[10,1],hack:[7,8],ground:10,xml:[10,37,18],onli:[0,1,2,4,6,7,14,10,11,12,13,16,18,20,21,22,23,28,30,32,33,35,37],explicitli:[22,10,4,33,18,14],nexta:12,fenc:21,nextc:12,transact:21,observedflow:30,enough:[10,1,30,13,22,4,7],doubleespresso:20,printstacktrac:[22,1],black:[9,1,30],analyz:21,jaroslav:22,clearselect:12,startswith:[6,18],proxy2:35,nearli:1,viewpoint:22,get:[1,2,23,6,7,14,9,10,11,12,13,16,17,18,19,20,21,22,30,32,33,37],ddaluminum:22,cannot:[21,33,10,0,12,32,28,16,22],ssh:7,afunct:14,gen:4,requir:[21,33,10,1,12,4,16,22,34,5,6,37,7,30,14,20],truli:[],prime:[22,1,30],reveal:36,isemptyxi:36,aluminum:22,dramat:1,yield:[3,32,4,23],spameggssausageandspam:10,expedi:1,pynam:10,scott:21,where:[21,10,11,30,12,2,4,23,33,19,5,6,7,22,14,36],vision:2,summari:[9,10,22],wiki:[10,11,29,22,7,14],"__module__":18,onlamp:18,pydictionari:10,booch:22,cafelattewet:20,testcas:[],rmi:35,purest:11,concern:[22,14,1],timeit:10,detect:[22,23,36,31],charat:10,review:[7,9,14,1],enumer:[16,18,6,12,23],label:[10,8,29],getattr:[28,35],trashbinset:22,between:[21,10,1,12,22,35,18,7,30],"import":[21,10,0,1,12,2,3,4,23,33,13,5,6,18,32,30,22],item2:23,across:[10,4],aslist:10,assumpt:[32,22],parent:[7,10],tup:10,screen:[22,0,1,30],inflex:20,cycl:33,pythoncardapp:30,findminima:11,come:[21,10,1,12,2,30,4,33,22,6,7,28,36],pythoncard:30,tug:7,newbyt:36,pepperdew:20,quiet:22,contract:2,inconsist:14,improv:[9,28,29,12,2,22,33,13,7],somecondit:1,minima:11,color:[13,30,18,36],overview:[7,9,22],unittest:[22,10,1,12],period:33,dispatch:[9,22,30,32,4,23],yearli:22,jeremi:36,colon:[33,10],exuperi:21,mousetrap:12,coupl:[21,9,22],games2:4,west:36,rebuild:10,mark:[21,33],appframework:0,quiesec:12,reflex:21,procedur:22,runal:12,spare:33,pythondecor:14,emphas:[13,22,10,4,18],test_x:18,nameless:10,trantabl:12,cafelatteextraespresso:20,findal:6,rememb:[33,22,10,23],lectur:17,"__eq__":[23,12],former:[16,28,18],those:[21,10,1,30,2,4,23,33,22,5,17,18,7,14],ispubl:1,sound:[2,14],myself:[14,17],tostr:10,keygen:7,trick:[10,5,22],cast:[10,22,37],invok:[10,1,23,33,22,18,7,14,20],outcom:[4,23],invoc:20,anytim:[13,30],advantag:[16,22,10,28,12],stdout:10,canon:[9,15],ivi:7,worri:[2,13,16],endswith:[10,6],eras:[1,4],myapp:0,couplet:22,shutil:6,fame:22,"__init__":[9,10,0,1,12,33,37,30,4,23,16,22,11,5,6,18,28,36,14,20,35],develop:[21,9,10,1,2,13,18,7],author:[11,30,18],blackboxtest:1,same:[21,33,10,11,1,12,13,30,4,23,16,22,35,18,28,14,20],check:[10,1,12,30,4,33,22,6,18,7,28,8],binari:7,html:[10,29,13,8,22,33,6,18,7,14],testrunn:[],customize1:0,pai:[2,10,22],document:[10,1,30,13,8,33,7,14],martelli:28,number_of_processor:31,nest:[33,28,4,20],foam:20,someon:[7,8,30],driven:[38,9,1,12,36],artima:18,mani:[10,1,12,2,28,33,22,18,7,30,14,20],extern:[9,22,1,12,6],tosynch:30,tradition:[33,1],hummingbird:30,appropri:[21,10,11,1,12,32,4,33,22],macro:[9,11,14],facad:37,pep8:13,gameenviron:4,without:[21,9,10,22,1,30,2,4,33,16,13,7,14,20],temptat:18,model:[21,32,22,30,20],dimension:[37,12],arrays2:33,execut:[9,10,11,1,30,4,23,33,22,7,14],tip:7,thermostatnight:[10,18],rest:[21,10,0,1,12,2,4,22,6,7,14],recyclea:22,aspect:[21,10,14,4,30],recycleb:22,touch:[32,22],monei:[2,12],flavor:11,speed:10,pythondecoratorlibrari:14,except:[10,0,1,12,23,22,18,14],littl:[21,10,1,12,22,33,7,14,36],blog:[7,18],tbinlist:22,pile:21,treatment:22,exercis:[9,10,11,1,12,32,30,4,22,0,17,37,28,20],frontmatt:8,mouseclick:30,real:[10,11,36,35],around:[21,22,1,30,13,32,4,33,35,5,36,14,20],todolist:[8,29],"0079ef2c":28,repaint:[36,30],grid:30,pop:[10,22,18],amp:[3,1],rununittest:1,presum:[22,4],returnarrai:10,mod:36,saniti:1,colorbox:30,stranger:21,vend:[9,12],chainofrespons:11,integ:[33,10,30],benefit:[10,30,2,22,33,13,35,20],either:[21,10,11,30,23,33,18,20],output:[10,0,1,12,13,8,28,33,29,18,7,14,20],margherita:20,manag:[21,10,11,12,30,32,28],fulfil:[21,11,35],tulach:22,satisfactori:22,adequ:[21,33],constitut:30,nonzero:1,regina:20,slice:10,mood:12,chronicl:21,boxobserverpythoncard:30,highest:7,definit:[22,0,1,2,10,33,35,14],evolv:[13,21,10,22,1],exit:[36,14,1,30,6],inject:[10,14,18],complic:[22,35,1,20],ratcount:36,refer:[21,28,22,1,12,2,4,23,33,13,35,36,18,7,20,19],power:[7,22,10,14,28],pythoninterpreterget:10,garbag:[10,1],inspect:[7,9,6,18],typedbin:22,standpoint:1,"__name__":[10,11,1,30,32,4,23,33,6,18,14,20],"throw":[16,10,1,12,4],comparison:[10,18,4,12],central:[16,22,12],greatli:22,max_num:22,firstnam:7,camembert:18,conditionc:12,panna:20,splitlin:6,currentlin:36,stand:[21,32,22,35],neighbor:30,act:[21,22,11,14],routin:35,effici:22,activest:18,lastli:[16,10],val2:33,quietli:10,"75f":20,strip:[22,20,1,12,6],counterintuit:22,your:[0,1,2,4,6,7,9,10,11,12,13,15,16,18,20,21,22,23,28,30,31,32,33,35],wustl:22,log:30,aren:[21,18,1,13,33,37],commenttag:6,overwrit:6,hee:35,stealth:10,interfac:[21,9,10,11,30,12,32,4,33,16,22,35,37,20],low:[21,22],lot:[21,10,1,12,2,22,33,18],pollin:32,strictli:22,unam:10,svn:10,tupl:[33,10,5,23],bundl:37,regard:21,vendingmachin:12,stepanov:16,conciev:12,"0076aa3c":28,functor:11,mice:12,conclus:16,faster:[10,1],notat:10,tripl:33,jc2:10,impenetr:1,possibl:[21,10,22,1,12,2,4,33,13,35,36,18,28,14,20],"default":[22,11,1,30,31,10,18,7,36],asynchronizedmethod:30,grasp:33,embed:10,clone:[7,22],expect:[21,10,22,23,33,19,14],gone:[10,11],creat:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,20,21,22,23,28,29,30,32,33,35,36,37],certain:[22,12,15,10,18,20],strongli:33,intro:[8,18],file:[9,10,0,1,12,13,15,22,33,11,6,7,30,8,36],jargon:32,rearrang:16,cream:20,incorrect:16,again:[2,22,10,1,33],setval:10,googl:7,want:[21,33,10,11,1,12,2,30,4,23,16,13,35,5,37,7,28,22,14,20,29],discrimin:33,my_decor:14,compel:[21,10,6],jpanel:30,awt:10,orient:[21,22,11,10,4,33,14],idiom:[21,9,11,30,25,35,7],valid:[10,1],compet:23,jset:10,you:[0,1,2,4,5,6,7,14,9,10,11,12,13,15,16,18,19,20,21,22,23,28,30,31,32,33,35,36,37],getdescript:20,inneradapt:37,architectur:[2,21,10,30],check_result:6,critic:10,inevit:22,registri:[10,18],sequenc:[21,33,10,11,12,22,16],tbin:22,vocabulari:21,pool:28,reduc:[1,20],bulk:[13,22],differentreturn:33,opennotifi:30,directori:[10,1,13,22,6,7,8],descript:[10,1,12,28,22,6,18,7,8,20],showmsg:33,gradient:21,mass:30,potenti:[21,30],escap:12,cpu:31,represent:12,all:[0,1,2,4,6,7,14,10,11,12,13,16,18,19,20,21,22,23,28,30,32,33,35],dist:10,consider:[9,22,20],messi:[22,23,31],recip:[9,18],lack:[10,1],dollar:12,sanitycheck:1,monti:33,abil:[21,30,2,32,13,18,14],follow:[21,10,22,1,12,2,4,23,33,13,35,5,18,7,30,14,20],princ:21,unclassifi:22,uses_metaclass:18,edong:7,"__cmp__":[10,18,12],init:0,program:[21,9,10,11,30,1,12,33,2,15,4,23,16,13,6,18,28,22,14],hasattr:[18,31],rstrip:6,cgi:[33,22],introduc:[21,10,1,2,22,13],"case":[33,10,11,1,30,2,4,23,16,22,35,5,18,28,14,36],liter:[33,23],straightforward:[21,10,22],fals:[22,10,6,12],checkin:[7,8],faq:7,util:[33,10,1,30,16,7],defvar:7,candid:[16,21],mechan:[9,22,0,13,23,16,33,11,18,14,35],failur:[21,11,1],veri:[21,9,10,11,1,30,2,4,23,33,13,7,28,14,36],bottleneck:10,bruceeckel:[7,16,10,21,1],lisp:14,list:[21,9,10,0,1,12,2,8,4,23,33,22,11,5,6,18,7,30,14,29],signific:[13,16,22,1,36],emul:[30,18],asingleton:18,small:[2,13,21,20],everth:15,dimens:30,tag1:18,tag2:18,tag3:18,pyobject:10,tea:20,tee:35,tex:7,zero:[10,1],shapefactori:4,design:[21,9,10,11,1,12,13,32,30,4,33,16,22,35,6,37,28,14,20],pass:[10,11,1,12,32,30,4,23,33,22,35,5,18,7,28,37,14,20],whene:35,further:[9,10,1,30,13,3,22,33,18,14],new_f:14,what:[1,2,3,4,6,7,14,9,10,11,12,13,16,18,19,20,21,22,28,30,33,35,37],sub:6,ntotal:22,hashset:10,abl:[21,10,0,1,12,2,4,23,16,13,11,22,36,35],brief:33,overload:[33,10,22,18],version:[10,22,30,12,2,8,4,23,33,13,18,7,28,37,14,19],succinct:[10,14],fillbin:22,"public":[21,10,1,2,22,13],contrast:33,movement:[21,22,11],hasn:[22,30,18],full:[7,33,10,35,6],hash:[16,33,12],variat:[21,28,37,22,12],sophist:[33,10,1,4],rlock:30,shouldn:[7,11],trunk:[7,9,10],demet:21,rudimentari:33,modifi:[10,22,1,12,2,32,30,4,23,33,13,18,7,28,14],valu:[10,1,12,23,33,22,5,18,37,14],search:[9,22,0,1,33,18,7],upcast:[22,4],ahead:[33,1],vegetarian:20,popen:10,prior:22,amount:[22,11,1,12,15,10],"0076daac":28,pick:22,action:[21,9,10,11,12,4,22,35,18],introductori:[9,10,2,33,7,14],scurri:36,pytupl:10,via:[10,2,22,23,18,7],shorthand:10,primit:[10,22],transit:[9,12],"while":[21,10,11,1,12,2,22,33,35,18,36],readili:21,filenam:[22,6,36],inappropri:[10,1],ystart:36,famili:[22,11,23],viewpost:18,establish:[16,33,22,1,12],jbutton:10,select:[21,9,10,11,30,12,13,22,7,20],kittiesandpuzzl:4,aggress:33,twa:10,proceed:22,distinct:[21,22,11,12,10,35,28],regist:[7,30],two:[10,0,1,12,2,32,30,4,23,33,22,35,6,18,28,37,14],coverag:[8,29,18],getweight:22,repetiti:15,machinediscoveri:31,taken:[13,22,10,1,4],automati:[],showtot:12,minor:30,more:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,20,21,22,23,28,29,30,32,33,35,36,37],visitabledecor:22,desir:[10,11,5,22,30],mydialog:10,apologet:14,reconfigur:32,convinc:1,ddcardboard:22,flag:[10,30],stick:[14,18],particular:[21,33,10,11,1,12,2,4,16,22,35,36,18,7,28,20],known:22,compani:[2,10],cach:10,dictat:2,none:[28,12,1,30,10,18],pyprog:1,jdk:[10,1,30],dev:7,histori:[7,9,14,6],testdemo2:1,remain:[16,22,12],caveat:[19,1],learn:[21,22,2,33,13,7],returnchang:12,statedemo:35,dee:35,def:[0,1,4,5,6,14,10,11,12,16,18,36,28,23,22,30,31,32,33,35,20,37],prompt:7,scan:13,challeng:36,registr:[9,18],share:[2,7,28],accept:[10,32,22,16,18,7],prose:13,minimum:[7,33,10,30],explor:16,explos:22,phrase:1,magenta:30,condemn:22,huge:20,cours:[21,10,1,29,2,4,22,35,37,20],goal:[21,9,10,1,12,2,22,33,14,36],awkward:10,divid:1,programmat:[20,18],anoth:[21,10,11,30,12,32,4,33,22,35,18,7,28,14,20],comfort:[1,37],myratno:36,ish:[13,33],smalltalk:[21,30],simpl:[9,10,0,1,12,4,33,22,35,18,7,30,37],css:[8,29],distro:10,plant:22,resourc:[9,1,30,37,8,36],algebra:16,variant:22,reflect:[9,10,22,1],associ:[33,10,22],"short":[33,31],waysid:1,ani:[21,33,10,22,1,12,2,30,4,16,13,35,36,18,7,28,14,20],confus:[22,37,30,32,33,18,14],ambigu:10,caus:[21,10,1,12,32,4,33,22,7,30],flwr:32,"0x7ecf0":18,drinkcompon:20,egg:[33,28],sysctl:31,help:[21,22,30,2,3,13,35,17,7],soon:1,held:[21,35,12],pythondialog:10,paper:[22,23],through:[21,33,10,11,1,12,2,30,4,23,16,13,35,18,28,22,14],cyan:30,hierarchi:[21,22,11,32,4,23,33,35],taxonomi:[21,9],makeschang:12,paramet:11,latt:20,style:[11,1,12,13,33,29,18,8],conjugategradi:11,alli:17,late:[22,20],rapidli:[10,30],astonish:21,bypass:18,match:[32,22,11,23,30],might:[21,10,11,1,30,2,4,23,16,22,14,36],attch:[],currentst:12,wouldn:[22,1,4],good:[21,10,1,12,2,22,33,13],"return":[33,10,11,1,12,31,32,30,4,23,16,22,35,5,6,18,28,37,14,20,36],pollut:21,ringbel:18,ttbinlist:22,framework:[21,9,10,0,1,12],somebodi:[2,7],placehold:12,complain:33,bigger:[10,12],whatiw:37,intricaci:4,customize2:0,hook:[9,30,18],solver:11,instruct:[7,1],refresh:[8,6],easili:[21,10,11,1,12,28,23,22,5,18,37],achiev:[28,10,22,18,14,20],compris:14,getmodifi:1,found:[21,22,1,14,36,7,8,20],strategypattern:11,proxyadapt:37,harm:[9,22,12],weight:22,hard:[13,16,22,4,32],idea:[21,10,11,12,2,8,4,13,35,17,7,22,14],ndiff:6,realli:[21,22,11,12,10,33,37,28],finish:[21,10,1,12,7,14],connect:[21,22,11,30,12,10,28],windowadapt:30,ddpaper:22,detect_cpu:31,todo:[9,10,29,6,7,8],event:[21,10,0,30,18,36],flower:[9,30,32],safeti:[33,1],classvariablesingleton:28,multiplejython:10,actionperform:10,setsiz:[36,30],publish:[2,22,10,1],research:[2,10,37],footnot:[21,10,11,1,12,28,22,8],gameelementfactori:4,print:[0,1,2,4,5,6,8,9,10,11,12,13,14,18,20,22,23,28,30,32,33,35,36],qualifi:[33,1],lutz:33,proxi:[21,9,10,12,28,16,35,37,20],advanc:[2,11,18],pub:18,reason:[21,10,11,1,12,2,4,33,22,35,18,37,14,20],base:[21,10,0,1,12,2,32,30,4,23,33,22,11,18,7,28,36,35],put:[21,9,10,22,1,12,2,8,4,33,13,5,6,18,7,28,14,17],teach:[2,9,1,17],bash:1,rewritten:[13,19],thrown:22,thread:[7,30,18,36],script:[13,9,10,11,33],struggl:21,revolutionari:1,perhap:[22,1,13,32,10,4,37],pythonsw:10,ascher:33,trashsort:22,lifetim:35,clump:5,assign:[10,33,5,18,7,14],major:[33,14,18],notifi:30,obviou:[16,22],blush:22,feel:[7,13,21,1],articl:[3,15,18],lastnam:7,number:[21,10,11,1,12,31,13,28,23,33,22,35,36,37,7,30,14,20],evolut:[21,22],sayhello:14,done:[10,11,1,30,2,4,33,13,18,7,8,29],construct:[16,10,14,1,18],colorboxestest:30,stabl:10,miss:[21,22,10,6],fanci:12,gpl:10,razor:21,differ:[21,33,10,11,1,12,8,4,23,16,22,35,6,18,32,7,30,14,20],php:30,exponenti:[21,20],interact:[32,10,4,37,23],tove:10,least:[21,10,1,22,33,7],addfactori:4,paint:[13,36],toi:18,expand:[7,35],statement:[10,11,1,12,4,33,22,35,30,14],scheme:[32,22,30],syrup:20,store:[14,1,12],itempairgen:23,imperfect:13,option:[21,11,30,2,33,6,7,20],relationship:[21,18],behind:[21,35],checklist:21,bsingleton:18,shapefactory1:4,shapefactory2:4,convieni:18,pars:[33,9,22,23],consult:2,closenotifi:30,eventu:[21,1],tortoisehg:7,albeit:[21,33,10,22],kind:[21,33,10,1,12,2,32,4,23,16,22,35,30,14],plop:22,whenev:[21,22,0,30,4,5,7,14],remot:35,gotten:12,remov:[21,22,30,12,2,16,18],kapow:10,pythoninterpret:10,reus:[21,28,0,12,10,22,11],getconstructor:[10,22],toward:[21,1],danc:35,weapon:32,runsawai:12,comput:[10,22,18],nastyweapon:4,ardent:1,requisit:1,"null":[35,1,12,36],gettotalcost:20,sell:2,imagin:[22,4],"0x7ed30":18,built:[21,9,10,11,1,30,2,22,33,35,7],equival:[22,1,30,10,33,18],restfil:[10,6],self:[0,1,4,5,6,14,9,10,11,12,16,18,36,21,28,23,22,30,32,33,35,20,37],violat:10,typediter:16,also:[21,33,10,11,1,12,2,30,4,16,13,36,17,18,38,7,28,22,14,20,29],bgboxobserv:30,build:[9,10,0,1,33,2,32,37,4,16,13,18,7,22,8],mouseev:30,brace:33,distribut:[7,13,10,4],exec:[10,18],blackboard:36,eater:32,previou:[22,12,2,4,14,20],reach:[21,11,36],mixtur:20,addobserv:30,most:[21,10,0,1,30,2,4,22,11,5,14,20],plai:[32,22,4],jsp:18,cygwin:7,eaten:32,thidiscuss:11,maco:31,alpha:10,amaz:[10,14,36],fileread:36,clear:[21,12,30,2,18,14],cover:[2,13,34,0,1],roughli:[1,12],"_shared_st":28,ext:[8,29],part:[21,9,10,0,1,30,2,8,22,26,33,24,25,11,6,18,7,14,20,36],clean:[33,22,10,1],jython2:10,xstart:36,usual:[21,10,0,1,22,33,5,18,14],mousetrap2:12,mousetrap1:12,ccolor:30,flowergen:32,canvaswidth:36,particularli:[13,33,22,23],uncov:10,font:[2,10],fine:[22,4,18],find:[21,10,11,1,2,4,33,13,18,7,22,14,20],impact:[22,14],flesh:10,solut:[21,10,11,1,12,30,4,23,22,18,28,20],pyutil:10,templat:[9,10,0,12,2,4,33,16,13,11,22,14],darkgrai:[36,30],shapefact1:4,affirm:[33,1],unus:21,cappuccinodecaf:20,express:[21,10,1,13,23,33],entry_exit_class:14,swing:10,nativ:[7,10],mainten:[22,20],wateroff:[10,18],ineffici:30,doubli:30,cyclic:12,stl:[16,10,11],common:[21,10,1,12,2,4,33,22,35,17,30],wrote:[10,1],commod:22,cafemochawetwhip:20,pyexcept:10,adopt:1,creator:[7,11,29],overwhelm:[7,18],startup:[7,10],potent:10,emac:[7,9,8],bare:30,aluminumbin:22,arg:[28,1,30,10,33,22,18,7,14,36],close:[30,1,12,36],horizont:36,skill:11,analog:33,dwarf:32,expert:[13,11],someth:[21,10,11,1,12,2,32,23,33,13,17,37,30,22,14,20],particip:7,conditionb:12,conditiona:12,weakli:[],testb:1,won:[10,30,2,22,33,13,18],mutex:30,autogener:[8,29],experi:[2,21,10,14,1],nope:1,birkenfeld:7,altern:[21,10,1,3,22,18,14],signatur:[33,10],str:[33,30,18],numer:[0,5,11,23],hasnext:[16,22,10,1,12],complement:21,sole:11,isol:[21,22,11,4],statemachin:[9,12],disallow:[4,18],cachedir:10,getmethod:[10,22],solv:[21,10,11,1,12,3,23,33,22,35,18,32,30,37,36],extraespresso:20,both:[21,10,30,13,4,23,33,22,35,36,18,7,28,14,20],"__instanc":28,last:[32,10,0,22,18],hyperlink:8,arraylist:[10,22],alon:[22,30],undetermin:0,context:[9,11,8],forgotten:15,commandpattern:11,whole:[22,11,1,12,2,10,30],load:[22,10,4,37,7,36],randomli:[32,1],simpli:[21,33,10,0,30,12,32,22,16,29,35,5,37],point:[21,28,11,1,12,31,2,4,33,13,18,7,30,22,14,36,19],schedul:[32,10],sweep:1,ceruleanblu:18,arbitrarili:[35,18],header:7,templatemethod:0,loveandtheft:14,param:10,linux:[7,8,18,31],throughout:[21,22,0,1,13,4],identif:22,java:[9,10,1,12,33,4,23,16,22,35,6,18,19,30,14,36],dum:35,due:1,empti:[36,30],implicit:14,mercuri:[7,9,8,29],newinst:[22,1],nois:1,pushnew:7,strategi:[9,11,6],addison:[22,11],versa:33,execfil:10,clariti:[13,20],imag:[13,30],great:[2,19,10,21],coordin:36,changeimp:35,understand:[21,10,12,13,28,33,22,18,14],demand:[2,33,35,1,4],makedir:6,fillablevisitor:22,look:[21,10,11,1,12,13,8,30,4,33,22,35,18,32,7,28,14,20,29],packag:[33,22,10,1,12],frozen:30,buildtabl:12,getquant:12,decrquant:12,ought:12,abov:[21,10,11,1,30,2,8,15,4,33,13,35,18,32,7,28,22,14,20],sublclass:18,fun:[14,18],anonym:[9,22,38],fum:10,everyon:[29,30,2,33,13,17],loop:[21,22,0,10,4,33],pack:10,argin5:10,propag:[21,22,30],pound:33,argin1:10,argin3:10,argin2:10,readi:[2,7,22,0,36],petal:30,itself:[21,10,11,12,13,22,14,36],orgpattern:22,coroutin:[3,9],chase:4,decor:[9,28,30,14,22,16,18,8,20],guido:29,restructur:[2,7,6,13,9],minim:[21,1,30],boxwidth:30,belong:2,on_openbackground:30,shorter:10,read:[21,9,10,0,1,12,31,2,3,22,33,6,18,30,14,36],conflict:[7,9,18],higher:7,cappucino:20,vertdir:36,optim:[10,22],painless:22,wherea:[33,10,11,22,12],wilson:14,setbackground:36,user:[9,10,30,12,2,4,16,22,7,28],stack:30,focal:21,recent:[10,1],lower:21,task:[7,13,30],lib:33,eleg:[21,28,22,33,35,14],entri:[13,8,10,14,36],localarrai:30,propog:30,parenthes:33,person:[7,10],testpythontojavaclass:10,chees:12,expens:[22,35],elev:[22,12],academ:1,imit:[7,33],propos:[7,21],explan:10,pyfloat:10,valueof:22,obscur:21,choru:35,world:[21,10,11,14,1],"67f":22,dumpclassinfo:10,move:[21,10,11,1,12,2,22,13,36,7,30,8,29],dirlist:11,cut:[22,37,30],indexof:[10,22],mydecor:14,getreturntyp:1,bick:18,snag:30,win:[32,10,23],input:[3,0,12],subsequ:[33,18,12],brainstorm:21,bin:[7,22,10,1],tomap:10,vendor:[32,22],format:[2,7,33,13],big:[33,14],intuit:10,pymeta3:18,alias:35,insert:[33,22,28,6,18],verion:7,bit:[33,10,30,2,22,4,16,35,14],characterist:0,formal:[33,14],lost:[10,22],docutil:[],signal:10,resolv:22,fluf:13,collect:[21,22,11,1,12,28,37],"__new__":[9,28,18],sizeabl:20,javabean:10,encount:[22,1,30,10,4,16],sketch:13,often:[21,10,11,1,12,2,32,15,22,33,13,5,17,18,30,37,14,20],acknowledg:[21,33],creation:[21,9,10,22,1,12,2,30,4,33,16,13,18,28,14],some:[0,1,2,3,4,5,7,8,10,11,12,13,14,17,18,36,21,23,22,29,30,31,33,37],back:[21,10,11,1,12,2,22,30,14,36],global:[10,1,18],understood:[10,1],wxpython:30,mirror:21,sprint:2,mindview:10,mousepress:30,syndrom:22,rien:21,scale:[3,10,1],chocol:20,mousemov:12,though:[22,1,30,28,18,14],per:[21,30,20,12,33],usernam:7,substitut:[33,14],mathemat:[11,23],larg:[10,12,2,3,22,34],market:32,fornam:[22,1],reproduc:2,norvig:30,machin:[7,9,12,31],addel:36,run:[21,9,10,0,1,12,22,33,11,6,18,7,30,14,36,35],martin:[22,14],agreement:10,stem:10,step:[21,33,10,1,2,4,16,22,18,7],initialst:12,subtract:21,impos:[16,12],sellimaginaryproduct:32,constraint:[21,33,22,12,2,16,14],materi:[2,13,10,17],memori:1,libero:12,dialog:10,cappuccinodrywhip:20,block:[13,6],plan:10,predat:32,repair:22,"__future__":[32,4,23],emphasi:18,pythonpath:33,within:[21,10,30,12,4,33,22,18,14],oreilli:33,"caf\u00e9":20,contributor:[2,9,8,29],chang:[21,9,10,0,1,12,13,32,30,4,22,34,35,6,18,7,28,37,14,20],artifici:1,connector:21,inclus:[21,33],institut:1,spam:[33,28,30],valuminum:22,question:[7,21,10,22,12],submit:1,custom:[7,10,0,22,20],clip3:22,clip2:22,adjac:30,arithmet:36,pocoo:[8,29],clip4:22,forward:[21,10],jarrai:10,blueprint:[2,7],properli:[22,10,14,23],hawaiian:20,sc_nprocessors_onln:31,link:[7,13,11,8],translat:[21,9,10,22,1,12,2,4,23,16,13,30,8,36],delta:6,line:[9,10,0,1,12,8,15,22,33,11,5,6,7,30,14,36],talli:22,info:[22,5,30],concaten:33,consist:[21,22,1,30,13,4,33,18,20],balabanov:28,strang:[33,4,12],jpython:10,priveleg:10,fillrect:[36,30],readlin:[10,22,12,36],similar:[21,10,11,1,12,22,33,35,18,30,14],toomuchaccess:1,parser:22,chao:1,doesn:[21,10,22,30,12,2,8,28,23,33,13,6,18,37,14],repres:[33,22,12],"char":[10,36],guarante:[7,12],cafe:20,fulful:11,titl:[10,30],water:[10,18],windowi:7,appendic:13,intvalu:10,create_exec:18,"_imag":13,addmouselisten:30,getbound:36,cappuccinoextraespresso:20,nice:[2,7,33],draw:[0,4,36,23],getdeclaredclass:1,cappuccinoextraespressowhip:20,state_d:35,topydictionari:10,eval:[4,23],itemavail:12,pymeta2:18,pricevisitor:22,lang:[10,22,18],algorithm:[21,9,22,11,30,4,16,36],vice:33,downcast:22,actionlisten:10,entryset:10,normpath:6,tradeoff:20,depth:18,greenhousecontrol:10,mindlessli:22,karma:[2,13],far:[21,33,22,1,18],java2pi:10,hello:[10,14,12],prototyp:[21,9,10,22],code:[0,1,4,6,7,8,9,10,11,12,14,15,16,17,18,20,21,22,30,32,33,35,36,38],partial:33,hashmap:[10,22,12],scratch:[10,14],tclone:22,ellips:18,overlap:30,edu:[22,14],benevol:2,privat:[28,0,1,30,10,7],successfuli:10,elsewher:13,friendli:1,send:[2,33,10,35,22],simplemeta1:18,granular:1,becam:1,paperscissorsrock2:23,sens:[21,10,11,1,4,33,22,5,18,14,20],junit:1,sent:10,func2:14,func1:14,cheapli:[10,22],mainstream:14,sausag:28,mous:[30,12],testdemo:1,electron:[2,13],chdir:1,volum:[2,13],whatius:37,implicitli:[21,33,10,4],kitti:4,tri:[10,11,22],troup:33,magic:28,succeed:11,counterproduct:22,knight:35,button:[7,10,4],fewer:18,"try":[21,10,11,1,30,13,22,37,7,14,36],session:12,mousetraptest:12,pleas:[2,7,8,19],boxobserv:[1,30],fortun:22,readabl:33,natur:[22,1,30,13,33,14,36],verbiag:33,elisp:7,jump:14,slithi:10,binset:22,singletondecor:28,download:[2,7,10,16,30],odd:[35,20],click:[7,13,30],append:[10,11,1,30,33,6,18,7],compat:29,index:[9,10,11,13,22,5,7,8],pymeta:18,compar:[22,11,1,10,18,7],espresso:20,access:[28,1,30,4,33,35,14],deleteobserv:30,runuculu:32,mouseadapt:30,spoken:22,whatev:[13,22,1],ibid:21,absolut:33,mikewatkin:18,len:[11,36,1,30,6],closur:14,intercept:[9,18],let:[10,1,12,13,4,22,14,20],becom:[21,33,10,1,12,22,16,18,30,20],sinc:[21,10,11,1,12,4,33,22,35,18,30,14,20],convert:[10,0,12,30,16,8],talent:2,convers:10,musser:16,larger:[22,29],makec:37,makeb:37,makea:37,fetch:[22,30],staticmethod:[28,18,4,6,37,14],earli:[13,19,10,1],typic:[21,22,11,1,12,33,0,5,18,14,20],ratcanmov:36,evalrock:23,chanc:11,boxi:18,appli:[21,22,12,1,30,33,37,14],app:30,foundat:[9,18,24],"_updat":6,pyton:10,fillablecollect:22,hennei:21,"boolean":[10,22,12,36],notenough:12,limb:14,newimp:35,puriti:10,fee:10,from:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,28,30,31,32,33,35,36,37,38],sysconf:31,zip:[7,6],commun:[2,10,36],doubl:[9,22,32,10,4,33,23,28],addtrash:22,whatihave3:37,whatihave2:37,implic:20,few:[5,20],camera:2,usr:[7,1],stage:[21,22,20],remaind:[7,9,22,8],sort:[21,33,10,11,22,16,18],clever:[21,18],src:7,trait:18,tplus1:14,impress:[10,22],train:2,bufferedread:36,iii:[9,26],starter:36,account:[7,1,20],alik:2,retriev:[],when:[21,10,11,1,12,2,32,37,4,23,33,19,35,36,18,7,30,22,14,20],annot:[14,12],thin:4,meet:[32,22,12],scatter:22,aquamac:7,proof:22,control:[21,9,10,11,30,12,13,4,33,22,35,7,28],cafemochawet:20,process:[21,33,10,0,1,12,13,4,23,16,22,11,18,7,14,20],lock:[2,14],trap:12,high:[21,22],tag:[13,4,12],trashvisitor:22,csum:22,onlin:[13,30,18],transitiona:12,kevlin:21,delai:[10,12],friendlier:7,comedi:33,georg:7,shapenamegen:4,sig:10,feta:20,subdirectori:[22,10,1,6],instead:[21,10,11,1,12,4,23,22,18,7,30,14,20],sin:10,stock:7,everywher:18,overridden:[33,22,0,1,12],pyarrai:10,hazard:11,callback:[22,11,30],rmtree:6,multipl:[9,10,11,30,13,32,28,23,33,22,7],"120dpi":7,cheaper:21,physic:36,alloc:1,drop:22,essenti:[21,22,11,1,10,33],seriou:1,newvsinit:18,correspond:[22,5,1,20],element:[21,10,1,12,22,33,18,14],issu:[13,21,28,22,18],allow:[21,10,11,30,12,32,4,22,0,18,14,29,35],subtyp:[22,18],horizdir:36,espressodecor:20,insight:[21,22],cleverdevil:18,evolutionari:22,comma:33,ponder:21,perfect:[2,13,22,21],outer:[28,10,37,1,30],chosen:[2,30,18],settitl:30,gnomesandfairi:4,newsgroup:7,repetet:18,decaf:20,criterion:30,tst:1,typemap:22,rat:[9,36],factor:[21,33,10,1],greater:10,"__getitem__":10,handl:[21,33,22,0,8],auto:7,spell:2,dai:[2,10,18],ctor:22,devel:7,dat:22,mention:[2,22,11,1,4],snake:33,front:[9,35,20],mylist:18,strive:22,multiprocess:3,somewher:[7,4,30],anyth:[21,10,1,30,2,22,13,14],edit:[9,22,16,33,18,7],tran:12,quest:21,mode:[2,7,10,6],isclass:6,batch:33,reserv:1,newtonsmethod:11,psum:22,flair:13,subset:[22,20],chung:28,tolist:10,openobserv:30,transitionb:12,transitionc:12,nodecor:20,"static":[21,9,10,1,12,4,33,22,6,18,28,37,20],"_delta":6,whet:21,our:[10,14,22,18],patch:[7,30],transitiont:12,special:[22,10,4,33,35,18,7],out:[21,9,10,22,1,12,31,2,30,4,23,33,13,18,7,28,14,19],variabl:[7,33,28,12],matt:14,contigu:30,cwr:36,dongwoo:7,hive:28,stub:35,texliv:7,suitabl:10,rel:22,leverag:[10,18],ref:7,"23f":22,math:[10,22,30],clarifi:2,insid:[10,1,12,4,33,22,37,7,30,14],sortintobin:22,manipul:[16,10,18],standalon:7,dictionari:[10,37,12,4,23,33,5,18,8],tempt:35,releas:[30,1,12],embarrass:1,correcton:2,could:[21,10,11,1,12,2,30,4,33,22,35,5,28],ask:[21,10,30,4,16,22,36,7,20],membership:22,keep:[21,10,22,1,12,2,4,13,35,5,18,7,30],length:[22,12,1,30,13,10,36],enforc:1,outsid:[33,22,10,4],south:36,softwar:[7,1],getclass:[16,32,10,22,12],qualiti:[21,1],scene:35,echo:[],date:10,set:[9,10,0,1,12,2,30,4,23,33,22,11,6,18,7,28,37,14,20],flyweight:12,newsingleton:28,facil:2,redund:11,cafemochaextraespressowhip:20,prioriti:7,"long":[10,22,2,4,33,13,35,7,28,14,20],start:[21,9,10,0,1,30,31,2,28,23,13,18,7,22,14,36],unknown:[22,23],licens:[2,9,10,28,17],perfectli:12,mkdir:10,fascin:18,messag:[21,10,12,1,30,33,7],attach:[13,9],termin:[33,11,1,36],"final":[21,9,10,0,1,30,2,32,22,13,36,18,7,14,20],shell:[7,33,10],rsa:7,exit_on_clos:[10,30],slider:4,rst:[2,7,8,6],exactli:[33,10,22,20],readlinelib:10,haven:[13,22],python3pattern:[7,8],cpython:10,embodi:21,split:[30,6,18],see:[0,1,2,4,6,7,8,10,11,12,14,16,18,19,20,21,22,28,30,33,35,37,38],structur:[21,9,10,11,1,12,22,16,33,35,36,20],charact:[10,4],bind:[2,22,23],steer:36,imho:33,aggreg:22,isstat:1,clearli:[21,22,20,1,12],have:[0,1,2,4,6,7,14,10,11,12,13,15,16,17,18,19,20,21,22,23,28,29,30,32,33,35,37],tabl:[9,12,32,23,16,33,35,38],need:[0,1,2,4,5,7,8,10,11,13,14,17,18,20,21,22,23,28,29,30,32,33,35,37],imatix:12,turn:[21,10,1,12,2,22,33,35,36,30,8,20],gentli:14,lightgrai:[36,30],messeng:[9,22,11,12,5,6],rout:21,rmic:35,mix:22,discret:10,sei:1,which:[0,1,2,3,4,5,6,7,14,10,11,12,13,15,16,18,20,21,22,23,28,30,32,33,35,36],linda:16,singl:[10,11,30,12,13,4,23,33,22,35,7,28,14],uppercas:0,entry_exit:14,"5b0":10,htmlhelp:7,who:[22,29,30,2,13,17,18,7,8],minimasolv:11,discov:[21,9,22,1,31,13,4,7],rigor:[33,1],textui:[],mactex:7,"class":[0,1,4,5,6,14,9,10,11,12,16,18,36,21,28,23,22,30,32,33,35,20,37,38],changealgorithm:11,wikic:22,gather:21,request:[21,11,36,12],face:22,pipe:10,"__slots__":18,bui:2,michel:[14,18],determin:[33,22,11,12,4,23,16,36],fowler:[22,14],occasion:1,constrain:1,fact:[21,28,1,30,10,33,22,14],statemachine2:12,dbm:12,text:[9,12,2,15,33,13,6,7,36],whatiuse2:37,bring:[21,10,2,22,33,14,36],developerguid:8,debat:13,trivial:[22,10,1,12],anywai:[13,33,11],pythoncardprototyp:30,redirect:[28,10,1],textual:30,locat:[10,11,1,12,22,7,8],launchpad:[2,13],createbox:30,hadn:12,winner:32,jar:10,mug:20,should:[21,33,10,11,1,12,13,3,4,16,22,36,18,7,30,14,20],smallest:[22,20],suppos:[22,1,30,10,4,33,14],esqu:33,disciplin:14,inhabit:32,local:[21,22,30,2,18,7,20],hope:[21,8,17],overidden:12,contribut:[2,7,29,13,9],espinc:22,ludicr:22,familiar:[7,16,22],disagre:6,autom:[10,1,12,13,15,22,18],regularli:[22,20],piecewis:11,bean:10,increas:1,applicationframework:0,triangl:4,extract:[22,10,1,6],enabl:[10,14],organ:[21,22,1,2,18,7],bisect:11,coplien:[22,11],mertz:18,grai:30,stuff:13,integr:[33,22,11,1,30],contain:[21,9,10,30,12,4,33,16,22,6,37,7,28],grab:22,ddglass:22,view:[13,30],conform:20,"0079e10c":28,frame:[10,36],knowledg:[33,1,4],popen2:31,dynatrash:22,temporarili:10,distract:10,py2int:10,syntact:32,polymorph:[9,22,32,4,23,33],statu:22,error:[10,1,12,13,22,6,18,30],dlg:10,correctli:[7,1],pattern:[21,9,10,11,1,12,32,30,4,16,22,26,6,37,7,28,14,20,35],boundari:[7,10],misus:[21,22],tend:[21,33,22,1,18],favor:21,state:[21,9,28,11,30,12,4,33,22,35],"__bases__":18,japplet:0,progress:[7,8,14],bunch:22,email:[7,21],pazzaglia:16,bed:30,kei:[22,12,32,10,23,33,37,7,20],p2j:10,itertool:[27,9],job:[2,33,22,0],entir:[21,10,30,22,33,14],measur:13,cafelattedecafwhip:20,addit:[10,1,12,2,22,33,35,18,7,30,14],exclaim:33,boxheight:30,admin:13,invulner:22,equal:[21,22,10,1,33],etc:[22,11,2,4,23,19,0,7,14,20],admit:[21,22],instanc:[28,1,12,10,23,18,20],equat:14,section:[21,10,32,22,4,34,37,7,8],freeli:[16,10,1],comment:[7,33,10,1],make_fil:6,interp2:10,"0076c54c":28,simpleclass:33,wall:36,guidelin:[13,33,22],kungfugui:4,arriv:22,chmod:10,walk:[21,10,1,6],distinguish:[22,10,8,1],incess:29,respect:22,labor:21,quit:[10,1,12,13,4,33,18,14,20],htmldiff:6,decent:21,obstacl:4,compon:[16,30,10,22,20],treat:[22,10,1,12],nextto:30,immedi:[22,14,1,36,4],interactwith:4,assert:[37,18,1,12,4],espressoconpanna:20,togeth:[10,11,22,33,35,37],present:[21,22,1,12,10,37,20],multi:12,main:[10,0,1,30,2,22,33,7,36],plain:[7,20],align:33,harder:10,defin:[21,33,10,0,1,12,30,4,16,22,5,18,28,14,20],aarrgggh:36,decept:10,observ:[21,9,28,1,12,22,30],cafemocha:20,htmlbutton:10,layer:[21,20],almost:[21,10,30,32,33,14],site:[2,22,11],motiv:[2,9,10,21,1],fiddl:35,incom:2,revis:22,cafemochadecaf:20,whatihav:37,bolder:1,mousemovelist:12,began:[21,1],classpath:[33,10,1],cross:[2,13,10],member:[22,1,30,2,32,23],python:[1,2,4,6,7,8,9,10,11,12,13,14,15,18,19,20,21,22,23,28,29,30,31,33,34,35],tendenc:22,fill:[10,22],infer:33,difficult:[21,10,12,2,22,33,20],competit:30,http:[10,11,1,12,8,22,29,18,7,30,14,36],original_new:28,denot:33,expans:[10,12],drink:20,upon:[32,10,14,22,18],effect:[28,11,1,12,4,23,22,18,30,37,20],coffe:[9,20],handi:30,issuccess:11,tribut:23,pdf:[2,7,13,9],canva:36,decoupl:[16,9,11,30],misappl:22,pull:[7,22,10,8,6],off:[21,10,30,2,15,22,33,18],center:10,albin:22,firstli:20,builder:[],well:[21,10,1,30,2,22,13,5,36,18,14,20],difflib:6,numerical_integr:11,thought:[21,28,11,29,22,16],scissor:23,weblog:[14,18],exampl:[0,1,2,4,6,7,8,9,10,11,12,13,14,18,20,21,22,23,28,29,30,32,33,35,36,37,38],command:[9,10,0,1,15,33,11,6,7],setq:7,choos:[9,10,11,1,2,4,22,18,7,8,20],breaker:21,latest:7,test1:[10,1],classset:18,test3:[10,1],test2:[10,1],test4:10,librari:[9,10,11,1,30,31,37,16,33,5,18],less:[21,22,1,13,5,18,14,20],hybrid:10,trust:1,heavili:[16,22],cafelatt:20,simultan:[7,22],gliffi:13,web:[2,33],rapid:10,newbrain:11,field:[9,10,1,12,13,33,18,30],bell:[10,22,18],makefil:[10,8,1,29],knew:[1,18],proxydemo2:35,add:[1,2,4,6,7,8,10,11,12,13,14,15,17,18,20,21,22,23,28,30,32,33,35,36],jython_hom:10,wet:20,collis:36,smart:[10,35,12],confront:28,jython:[9,10,8,18],royalti:[2,10],elementat:36,fate:22,sumvalu:22,caller:[22,4,18],piec:[21,22,28,6],arguabl:[10,22],testa:1,camelcas:13,realiz:[16,21,22,1,33],know:[10,22,1,30,2,8,23,13,7,14],press:[33,10],redesign:22,height:[36,30],recurs:[22,11,4],loss:20,trash:[21,9,22],resid:33,like:[1,2,4,7,14,10,11,12,13,16,17,18,36,21,23,22,29,30,32,33,35,20],success:[21,10,11,1,22,16],incred:33,paperbin:22,necessari:[22,0,1,12,10,33,35,37,7],lose:[22,10,23,32],resiz:[33,0],boxdesc:30,page:[7,9,11,14,33],poor:22,sum:[33,22],trashbin:22,captur:[10,14],suppli:10,phenomena:30,cafemochaextraespresso:20,growth:20,"export":[7,10],superclass:10,flush:1,proper:[10,22,12],simple4:18,peter:30,simple1:18,simple3:18,simple2:[33,18],tmp:1,"__setattr__":28,est:21,leaf:18,lead:21,bintyp:22,avoid:[7,21,22],setlayout:30,slide:17,"__getattr__":[28,35],leav:[22,30],itemnotavail:12,speak:[2,35],getnam:[22,1],myfunct:33,hinder:33,weslei:[22,11],slower:[21,10],investig:36,usag:[21,9,22,1],facilit:[22,30],host:[2,7],although:[21,10,22,1,2,4,13,5,7,14],offset:30,beneath:0,simpler:[21,22,1,30,28,35,18,14],about:[21,9,10,22,1,12,31,2,8,4,23,16,13,36,18,7,37,14,20,33],quarter:12,actual:[21,33,10,11,1,12,4,23,16,22,35,6,30,14],column:30,purist:22,javaclass:10,mindviewinc:[],bridg:10,constructor:[9,10,0,1,12,30,4,33,22,18,28,14],wxcommandev:30,"0076b7ac":28,own:[21,10,30,1,12,2,15,4,23,33,22,34,35,6,18,7,28,8,20,36],fillov:36,bashrc:10,automat:[9,10,11,1,12,13,15,4,33,22,35,5,6,18,7,30,37,29],guard:21,getpric:12,awhil:21,rectifi:[22,14],pitfal:33,forget:22,mere:10,merg:[7,9,8],prozac:12,val:[33,22,10,28,30],transfer:[9,5,12],inner:[9,10,1,30,28,22,37,38,14],arg1:[33,14],maze:[9,36],typenum:22,arg2:[33,14],"function":[9,10,11,1,12,33,3,30,4,23,16,22,5,18,32,7,28,14],mailer:7,north:36,pythontojavaclass:10,subscrib:21,triangular:18,bodi:[33,22,11,14],gain:[2,18],eas:[22,20,12],inlin:18,bug:[7,32,22,1],count:[33,1,12],made:[22,12,30,13,10,29,18],cleanup:1,newval:22,whether:[22,11,30,12,2,10,18,36],wish:[10,1,20],scroll:10,displai:[33,10,14,1,6],troubl:[7,33,10],record:36,below:[7,10,11,30,20],limit:[33,10,14,28,18],testfil:6,trepid:14,otherwis:[21,22,11,1,30,2,18],problem:[21,33,10,11,1,12,3,30,4,23,16,22,35,18,32,28,37,14,20],jdialog:10,evalu:12,"int":[22,12,1,30,31,10,8,36],rather:[33,10,1,30,31,13,32,4,16,22,35,18,37,14,20],dure:[10,1,12,2,22,16,35,14],twist:22,implement:[21,9,10,11,1,12,32,4,33,22,35,36,18,30,37,14,20],decorator_function_with_argu:14,ing:18,eric:[35,30],probabl:[21,10,11,30,13,23,33,22,35,5,18,14],typemapadapt:22,nonetheless:14,entry_exit_funct:14,detail:[21,9,28,11,30,31,32,22,7],virtual:[22,0,12,32,4,33,35,7],preinstal:7,other:[0,1,2,4,7,8,9,10,11,12,13,14,15,16,18,20,21,22,23,28,30,32,33,35,36,37],lookup:[32,23],futur:[2,10],branch:[7,9,22,8,36],bazzar:13,repeat:[21,11,30,4,7,20],star:28,fulli:33,multipledispatch:23,cafelatteextraespressowhip:20,singleton:[21,9,28,18,12,37],lightoff:[10,18],mazework:36,stai:[21,22,11],experienc:33,sphinx:[9,29,2,13,7,8],interp1:10,came:[16,21,22],indirectli:22,rule:[21,9,10,1,13,33],fillabl:22,portion:1,klass:[28,30,18],cookbook:18},titles:["Building Application Frameworks","Unit Testing &amp; Test-Driven Development","Introduction","Coroutines &amp; Concurrency","Factory: Encapsulating Object Creation","Messenger/Data Transfer Object","Comprehensions","Developer Guide","ToDo List","Python 3 Patterns, Recipes and Idioms","Jython","Function Objects","StateMachine","Book Development Rules","Decorators","A Canonical Form for Command-Line Programs","Iterators: Decoupling Algorithms from Containers","Teaching Support","Metaclasses","A Note To Readers","Decorator: Dynamic Type Selection","The Pattern Concept","Pattern Refactoring","Multiple Dispatching","Part I: Foundations","Part II: Idioms","Part III: Patterns","Generators, Iterators, and Itertools","The Singleton","Contributors","Observer","Discovering the Details About Your Platform","Visitor","Quick Python for Programmers","Python 3 Language Changes","Fronting for an Implementation","Projects","Changing the Interface","Table-Driven Code: Configuration Flexibility"],modules:{},descrefs:{},filenames:["AppFrameworks","UnitTesting","Introduction","CoroutinesAndConcurrency","Factory","Messenger","Comprehensions","DeveloperGuide","ToDo","index","Jython","FunctionObjects","StateMachine","Rules","PythonDecorators","CanonicalScript","Iterators","TeachingSupport","Metaclasses","NoteToReaders","Decorator","PatternConcept","PatternRefactoring","MultipleDispatching","Part1","Part2","Part3","GeneratorsIterators","Singleton","Contributors","Observer","MachineDiscovery","Visitor","QuickPython","LanguageChanges","Fronting","Projects","ChangeInterface","TableDriven"]})

src/Metaclasses.rst

     print(ml.x)
     ml.howdy("John")
 
+    """ Output:
+    ['Camembert']
+    42
+    Howdy, John
+    """
+
 The ability to generate classes programmatically using ``type`` opens
 up some interesting possibilities. Consider the GreenHouseLanguage.py
 example in the Jython chapter -- all the subclasses in that case were
         exec initializations in globals()
         Event.run_events()
 
+    """ Output:
+    1.00: Light on [mc]
+    1.00: Light on [exec]
+    2.00: Light off [mc]
+    2.00: Light off [exec]
+    3.30: Water on [mc]
+    3.30: Water on [exec]
+    4.45: Water off [mc]
+    4.45: Water off [exec]
+    5.00: Thermostat night [mc]
+    5.00: Thermostat night [exec]
+    6.00: Thermostat day [mc]
+    6.00: Thermostat day [exec]
+    7.00: Ring bell [mc]
+    7.00: Ring bell [exec]
+    """
+
 The ``Event`` base class is the same. The classes are created
 automatically using the ``create_mc()`` function, which takes its
 ``description`` argument and generates a class name from it. Then it
 examples. Even so, the above example makes it quite clear what's
 happening: the class object is created, then modified, then returned.
 
-.. Note:: Or does it?
+.. Note:: Or does it allow that syntax?
 
 
 The Metaclass Hook in Python 3
 
 It is sometimes convienient to use inheritance as an organizing
 mechanism -- each sublclass becomes an element of a group that you
-work on. For example, the **CodeManager.py** in the **Comprehensions**
+work on. For example, in **CodeManager.py** in the **Comprehensions**
 chapter, the subclasses of **Language** were all the languages that
 needed to be processed. Each **Language** subclass described specific
 processing traits for that language.
 
 (As in the Comprehensions chapter)
 
+Example: Making a Class "Final"
+================================================================================
+
+It is sometimes convenient to prevent a class from being inherited::
+
+    # Metaclasses/Final.py
+    # Emulating Java's 'final'
+
+    class final(type):
+        def __init__(cls, name, bases, namespace):
+            for klass in bases:
+                if isinstance(klass, final):
+                    raise TypeError(str(klass.__name__) + " is final")
+            super(final, cls).__init__(name, bases, namespace)
+
+    class A(object):
+        pass
+
+    class B(A):
+        __metaclass__= final
+
+    # Produces compile-time error:
+    class C(B):
+        pass
+
+    """ Output:
+    ...
+    TypeError: B is final
+    """
+
+.. can this be done with decorators?
+
 
 Using ``__init__`` vs. ``__new__`` in Metaclasses
 ================================================================================
 Intercepting Class Creation
 --------------------------------------------------------------------------------
 
-This example implements singleton using metaclasses, by overriding the
+This example implements *Singleton* using metaclasses, by overriding the
 ``__call__()`` metamethod, which is invoked when a new instance is
 created::
 
+    # Metaclasses/Singleton.py
+
     class Singleton(type):
-    	instance = None # I don't think this will work; needs to be
-		     	# attched to the class.
-    	def __call__(cls, *args, **kw):
+        instance = None
+        def __call__(cls, *args, **kw):
             if not cls.instance:
-              	 cls.instance = super(Singleton, cls).__call__(*args, **kw)
-	    return cls.instance
+                 cls.instance = super(Singleton, cls).__call__(*args, **kw)
+            return cls.instance
 
     class ASingleton(object):
-        __metaclass__ == Singleton
+        __metaclass__ = Singleton
 
     a = ASingleton()
     b = ASingleton()
     assert a is b
+    print(a.__class__.__name__, b.__class__.__name__)
+
+    class BSingleton(object):
+        __metaclass__ = Singleton
+
+    c = BSingleton()
+    d = BSingleton()
+    assert c is d
+    print(c.__class__.__name__, d.__class__.__name__)
+    assert c is not a
+
+    """ Output:
+    ('ASingleton', 'ASingleton')
+    ('BSingleton', 'BSingleton')
+    """
 
 By overriding ``__call__()`` in the metaclass, the creation of
 instances are intercepted. Instance creation is bypassed if one
 already exists.
 
+Note the dependence upon the behavior of static class fields. When
+``cls.instance`` is first read, it gets the static value of
+``instance`` from the metaclass, which is ``None``. However, when the
+assignment is made, Python creates a local version for the particular
+class, and the next time ``cls.instance`` is read, it sees that local
+version. Because of this behavior, each class ends up with its own