Commits

Bruce Eckel committed 2bda9b6

Nearly done with Jython chapter (for now). Will do a final editing pass, then wait for Jython 2.5.1.

Comments (0)

Files changed (5)

 </div>
 <p>The download is a <strong>.class</strong> file, which will run an installer when
 you execute it with Java.</p>
-<p>You also need to add <strong>jython-complete.jar</strong> to your Java CLASSPATH.
-As an example, here is the appropriate section in my <tt class="docutils literal"><span class="pre">.bashrc</span></tt>:</p>
+<p>You also need the Java Development Kit (JDK), and to add
+<strong>jython-complete.jar</strong> to your Java CLASSPATH.  As an example, here
+is the appropriate section in my <tt class="docutils literal"><span class="pre">.bashrc</span></tt> for <strong>*nix</strong>; for Windows you
+need to do the equivalent:</p>
 <div class="highlight-python"><pre>export set JYTHON_HOME="/Users/bruceeckel/jython2.5b0"
 export set CLASSPATH=.:..:$JYTHON_HOME/jython-complete.jar</pre>
 </div>
-<p>When you run Jython, you might get the error: <tt class="docutils literal"><span class="pre">can't</span> <span class="pre">create</span> <span class="pre">package</span>
-<span class="pre">cache</span> <span class="pre">dir,</span> <span class="pre">'/cachedir/packages'</span></tt>. Jython caching requires
-<tt class="docutils literal"><span class="pre">/cachedir/packages/</span></tt> in the <tt class="docutils literal"><span class="pre">python.home</span></tt> directory. It is often
-the case on *nix that users lack sufficient priveledges to create or
-write to this directory. Because the problem is merely permissions,
-something like <tt class="docutils literal"><span class="pre">mkdir</span> <span class="pre">cachedir;</span> <span class="pre">chmod</span> <span class="pre">a+rw</span> <span class="pre">cachedir</span></tt> within the
-Jython directory should eliminate this error message.</p>
+<p>When you run Jython, you might get the warning: <tt class="docutils literal"><span class="pre">can't</span> <span class="pre">create</span> <span class="pre">package</span>
+<span class="pre">cache</span> <span class="pre">dir,</span> <span class="pre">'/cachedir/packages'</span></tt>. Jython will still work, but startup
+will be slower because caching isn&#8217;t happening. Jython caching
+requires <tt class="docutils literal"><span class="pre">/cachedir/packages/</span></tt> in the <tt class="docutils literal"><span class="pre">python.home</span></tt> directory. It
+is often the case on <strong>*nix</strong> that users lack sufficient priveleges to
+create or write to this directory. Because the problem is merely
+permissions, something like <tt class="docutils literal"><span class="pre">mkdir</span> <span class="pre">cachedir;</span> <span class="pre">chmod</span> <span class="pre">a+rw</span> <span class="pre">cachedir</span></tt>
+within the Jython directory should eliminate this warning message.</p>
 <div class="section" id="getting-the-trunk">
 <h3>Getting the Trunk<a class="headerlink" href="#getting-the-trunk" title="Permalink to this headline">¶</a></h3>
 <div class="admonition note">
 <tt class="docutils literal"><span class="pre">jython</span> <span class="pre">GreenHouseLanguage.py</span></tt>.</p>
 </div>
 <p>The constructor of each derived class calls the base-class constructor, which
-adds the new object to the list. The <strong>run( )</strong> function sorts the list, which
-automatically uses the <strong>__cmp__( )</strong> method that was defined in <strong>Event</strong> to
+adds the new object to the list. The <strong>run()</strong> function sorts the list, which
+automatically uses the <strong>__cmp__()</strong> method that was defined in <strong>Event</strong> to
 base comparisons on time only. In this example, it only prints out the list, but
 in the real system it would wait for the time of each event to come up and then
 run the event.</p>
 </pre></div>
 </div>
 <p>The <strong>PythonInterpreter</strong> object is a complete Python interpreter that accepts
-commands from the Java program. One of these commands is <strong>execfile( )</strong>, which
+commands from the Java program. One of these commands is <strong>execfile()</strong>, which
 tells it to execute all the statements it finds in a particular file. By
 executing <strong>GreenHouseLanguage.py</strong>, all the classes from that file are loaded
 into our <strong>PythonInterpreter</strong> object, and so it now &#8220;holds&#8221; the greenhouse
 your program as simple as possible for the end user. With Jython you can achieve
 this with almost no effort at all.</p>
 <p>One of the other methods available to the <strong>PythonInterpreter</strong> is
-<strong>exec( )</strong>, which allows you to send a command to the interpreter. In
-the above program, the <strong>run( )</strong> function is called using <strong>exec()</strong>.</p>
+<strong>exec()</strong>, which allows you to send a command to the interpreter. In
+the above program, the <strong>run()</strong> function is called using <strong>exec()</strong>.</p>
+</div>
+<div class="section" id="controlling-java-from-jython">
+<h2>Controlling Java from Jython<a class="headerlink" href="#controlling-java-from-jython" title="Permalink to this headline">¶</a></h2>
+<p>Since you have the Java language at your disposal, and you can set and retrieve
+values in the interpreter, there&#8217;s a tremendous amount that you can accomplish
+with the above approach (controlling Python from Java).  But one of the amazing
+things about Jython is that it makes Java classes almost transparently available
+from within Jython. Basically, a Java class looks like a Python class. This is
+true for standard Java library classes as well as classes that you create
+yourself, as you can see here:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c"># Jython/JavaClassInPython.py</span>
+<span class="c"># run with: jython.bat JavaClassInPython.py</span>
+<span class="c"># Using Java classes within Jython</span>
+<span class="k">from</span> <span class="nn">java.util</span> <span class="k">import</span> <span class="n">Date</span><span class="p">,</span> <span class="n">HashSet</span><span class="p">,</span> <span class="n">HashMap</span>
+<span class="k">from</span> <span class="nn">Jython.javaclass</span> <span class="k">import</span> <span class="n">JavaClass</span>
+<span class="k">from</span> <span class="nn">math</span> <span class="k">import</span> <span class="n">sin</span>
+
+<span class="n">d</span> <span class="o">=</span> <span class="n">Date</span><span class="p">()</span> <span class="c"># Creating a Java Date object</span>
+<span class="k">print</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="c"># Calls toString()</span>
+
+<span class="c"># A &quot;generator&quot; to easily create data:</span>
+<span class="k">class</span> <span class="nc">ValGen</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">maxVal</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">maxVal</span><span class="p">)</span>
+    <span class="c"># Called during &#39;for&#39; iteration:</span>
+    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
+        <span class="c"># Returns a tuple of two elements:</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">sin</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
+
+<span class="c"># Java standard containers:</span>
+<span class="nb">map</span> <span class="o">=</span> <span class="n">HashMap</span><span class="p">()</span>
+<span class="n">set</span> <span class="o">=</span> <span class="n">HashSet</span><span class="p">()</span>
+
+<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">ValGen</span><span class="p">(</span><span class="mf">10</span><span class="p">):</span>
+    <span class="nb">map</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+    <span class="n">set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
+    <span class="n">set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="nb">map</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">set</span><span class="p">)</span>
+
+<span class="c"># Iterating through a set:</span>
+<span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="n">set</span><span class="p">:</span>
+    <span class="k">print</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">z</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="nb">map</span><span class="p">[</span><span class="mf">3</span><span class="p">])</span> <span class="c"># Uses Python dictionary indexing</span>
+<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">map</span><span class="o">.</span><span class="n">keySet</span><span class="p">():</span> <span class="c"># keySet() is a Map method</span>
+    <span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">map</span><span class="p">[</span><span class="n">x</span><span class="p">])</span>
+
+<span class="c"># Using a Java class that you create yourself is</span>
+<span class="c"># just as easy:</span>
+<span class="n">jc</span> <span class="o">=</span> <span class="n">JavaClass</span><span class="p">()</span>
+<span class="n">jc2</span> <span class="o">=</span> <span class="n">JavaClass</span><span class="p">(</span><span class="s">&quot;Created within Jython&quot;</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">jc2</span><span class="o">.</span><span class="n">getVal</span><span class="p">())</span>
+<span class="n">jc</span><span class="o">.</span><span class="n">setVal</span><span class="p">(</span><span class="s">&quot;Using a Java class is trivial&quot;</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">getVal</span><span class="p">())</span>
+<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">getChars</span><span class="p">())</span>
+<span class="n">jc</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="s">&quot;Using bean properties&quot;</span>
+<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Note that the <strong>import</strong> statements map to the Java package structure exactly as
+you would expect. In the first example, a <strong>Date()</strong> object is created as if it
+were a native Python class, and printing this object just calls <strong>toString()</strong>.</p>
+<p><strong>ValGen</strong> implements the concept of a &#8220;generator&#8221; which is used a great deal in
+the C++ STL (<em>Standard Template Library</em>, part of the Standard C++ Library). A
+generator is an object that produces a new object every time its &#8220;generation
+method&#8221; is called, and it is quite convenient for filling containers. Here, I
+wanted to use it in a <strong>for</strong> iteration, and so I needed the generation method
+to be the one that is called by the iteration process. This is a special method
+called <strong>__getitem__()</strong>, which is actually the overloaded operator for
+indexing, &#8216;<strong>[ ]</strong>&#8216;. A <strong>for</strong> loop calls this method every time it wants to
+move the iteration forward, and when the elements run out, <strong>__getitem__()</strong>
+throws an out-of-bounds exception and that signals the end of the <strong>for</strong> loop
+(in other languages, you would never use an exception for ordinary control flow,
+but in Python it seems to work quite well). This exception happens automatically
+when <strong>self.val[i]</strong> runs out of elements, so the <strong>__getitem__()</strong> code turns
+out to be simple. The only complexity is that <strong>__getitem__()</strong> appears to
+return <em>two</em> objects instead of just one. What Python does is automatically
+package multiple return values into a tuple, so you still only end up returning
+a single object (in C++ or Java you would have to create your own data structure
+to accomplish this). In addition, in the <strong>for</strong> loop where <strong>ValGen</strong> is used,
+Python automatically &#8220;unpacks&#8221; the tuple so that you can have multiple iterators
+in the <strong>for</strong>. These are the kinds of syntax simplifications that make Python
+so endearing.</p>
+<p>The <strong>map</strong> and <strong>set</strong> objects are instances of Java&#8217;s <strong>HashMap</strong> and
+<strong>HashSet</strong>, again created as if those classes were just native Python
+components. In the <strong>for</strong> loop, the <strong>put()</strong> and <strong>add()</strong> methods work just
+like they do in Java. Also, indexing into a Java <strong>Map</strong> uses the same notation
+as for dictionaries, but note that to iterate through the keys in a <strong>Map</strong> you
+must use the <strong>Map</strong> method <strong>keySet()</strong> rather than the Python dictionary
+method <strong>keys()</strong>.</p>
+<p>The final part of the example shows the use of a Java class that I created from
+scratch, to demonstrate how trivial it is. Notice also that Jython intuitively
+understands JavaBeans properties, since you can either use the <strong>getVal()</strong> and
+<strong>setVal()</strong> methods, or assign to and read from the equivalent <strong>val</strong>
+property. Also, <strong>getChars()</strong> returns a <strong>Character[]</strong> in Java, and this
+becomes an array in Python.</p>
+<p>The easiest way to use Java classes that you create for use inside a Python
+program is to put them inside a package. Although Jython can also import
+unpackaged java classes (<strong>import JavaClass</strong>), all such unpackaged java classes
+will be treated as if they were defined in different packages so they can only
+see each other&#8217;s public methods.</p>
+<p>Java packages translate into Python modules, and Python must import a module in
+order to be able to use the Java class. Here is the Java code for <strong>JavaClass</strong>:</p>
+<div class="highlight-java"><div class="highlight"><pre><span class="c">// Jython/javaclass/JavaClass.java</span>
+<span class="k">package</span> <span class="n">Jython</span><span class="o">.</span><span class="na">javaclass</span><span class="o">;</span>
+<span class="k">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
+
+<span class="k">public</span> <span class="k">class</span> <span class="nc">JavaClass</span> <span class="o">{</span>
+  <span class="k">private</span> <span class="n">String</span> <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">;</span>
+  <span class="k">public</span> <span class="nf">JavaClass</span><span class="o">()</span> <span class="o">{</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;JavaClass()&quot;</span><span class="o">);</span>
+  <span class="o">}</span>
+  <span class="k">public</span> <span class="nf">JavaClass</span><span class="o">(</span><span class="n">String</span> <span class="n">a</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">s</span> <span class="o">=</span> <span class="n">a</span><span class="o">;</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;JavaClass(String)&quot;</span><span class="o">);</span>
+  <span class="o">}</span>
+  <span class="k">public</span> <span class="n">String</span> <span class="nf">getVal</span><span class="o">()</span> <span class="o">{</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;getVal()&quot;</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">s</span><span class="o">;</span>
+  <span class="o">}</span>
+  <span class="k">public</span> <span class="kt">void</span> <span class="nf">setVal</span><span class="o">(</span><span class="n">String</span> <span class="n">a</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;setVal()&quot;</span><span class="o">);</span>
+    <span class="n">s</span> <span class="o">=</span> <span class="n">a</span><span class="o">;</span>
+  <span class="o">}</span>
+  <span class="k">public</span> <span class="n">Character</span><span class="o">[]</span> <span class="n">getChars</span><span class="o">()</span> <span class="o">{</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;getChars()&quot;</span><span class="o">);</span>
+    <span class="n">Character</span><span class="o">[]</span> <span class="n">r</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Character</span><span class="o">[</span><span class="n">s</span><span class="o">.</span><span class="na">length</span><span class="o">()];</span>
+    <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">s</span><span class="o">.</span><span class="na">length</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span>
+      <span class="n">r</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Character</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">));</span>
+    <span class="k">return</span> <span class="n">r</span><span class="o">;</span>
+  <span class="o">}</span>
+  <span class="k">public</span> <span class="k">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">JavaClass</span>
+      <span class="n">x1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JavaClass</span><span class="o">(),</span>
+      <span class="n">x2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JavaClass</span><span class="o">(</span><span class="s">&quot;UnitTest&quot;</span><span class="o">);</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">x2</span><span class="o">.</span><span class="na">getVal</span><span class="o">());</span>
+    <span class="n">x1</span><span class="o">.</span><span class="na">setVal</span><span class="o">(</span><span class="s">&quot;SpamEggsSausageAndSpam&quot;</span><span class="o">);</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">x1</span><span class="o">.</span><span class="na">getChars</span><span class="o">()));</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+</div>
+<p>You can see that this is just an ordinary Java class, without any awareness that
+it will be used in a Jython program. For this reason, one of the important uses
+of Jython is in testing Java code <a class="footnote-reference" href="#id4" id="id2">[2]</a>. Because Python is such a powerful,
+flexible, dynamic language it is an ideal tool for automated test frameworks,
+without making any changes to the Java code that&#8217;s being tested.</p>
+<div class="section" id="inner-classes">
+<h3>Inner Classes<a class="headerlink" href="#inner-classes" title="Permalink to this headline">¶</a></h3>
+<p>Inner classes becomes attributes on the class object. Instances of <strong>static</strong>
+inner classes can be created with the usual call:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="o">.</span><span class="n">StaticInnerClass</span><span class="p">()</span>
+</pre></div>
+</div>
+<p>Non-<strong>static</strong> inner classes must have an outer class instance supplied
+explicitly as the first argument:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="o">.</span><span class="n">InnerClass</span><span class="p">(</span><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="p">())</span>
+</pre></div>
+</div>
+</div>
 </div>
 <div class="section" id="controlling-the-interpreter">
 <h2>Controlling the Interpreter<a class="headerlink" href="#controlling-the-interpreter" title="Permalink to this headline">¶</a></h2>
-<p>The prior example only creates and runs the interpreter using external scripts.
-In the rest of this chapter, we shall look at more sophisticated ways to
+<p>In the rest of this chapter, we shall look at more sophisticated ways to
 interact with Jython. The simplest way to exercise more control over the
 <strong>PythonInterpreter</strong> object from within Java is to send data to the
 interpreter, and pull data back out.</p>
 <div class="section" id="putting-data-in">
 <h3>Putting Data In<a class="headerlink" href="#putting-data-in" title="Permalink to this headline">¶</a></h3>
 <p>To inject data into your Python program, the <strong>PythonInterpreter</strong> class has a
-deceptively simple method: <strong>set( )</strong>. However, <strong>set( )</strong> takes many different
+deceptively simple method: <strong>set()</strong>. However, <strong>set()</strong> takes many different
 data types and performs conversions upon them.  The following example is a
-reasonably thorough exercise of the various <strong>set( )</strong> possibilities, along with
+reasonably thorough exercise of the various <strong>set()</strong> possibilities, along with
 comments that should give a fairly complete explanation:</p>
 <div class="highlight-java"><div class="highlight"><pre><span class="c">// Jython/PythonInterpreterSetting.java</span>
 <span class="c">// Passing data from Java to python when using</span>
 </pre></div>
 </div>
 <p>As usual with Java, the distinction between real objects and primitive types
-causes trouble. In general, if you pass a regular object to <strong>set( )</strong>, it knows
+causes trouble. In general, if you pass a regular object to <strong>set()</strong>, it knows
 what to do with it, but if you want to pass in a primitive you must perform a
 conversion. One way to do this is to create a &#8220;Py&#8221; type, such as <strong>PyInteger</strong>
 or <strong>PyFloat</strong>. but it turns out you can also use Java&#8217;s own object wrappers
 like <strong>Integer</strong> and <strong>Float</strong>, which is probably going to be a lot easier to
 remember.</p>
-<p>Early in the program you&#8217;ll see an <strong>exec( )</strong> containing the Python statement:</p>
+<p>Early in the program you&#8217;ll see an <strong>exec()</strong> containing the Python statement:</p>
 <div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mf">5</span><span class="p">:])</span>
 </pre></div>
 </div>
 produce the elements zero through 5. The reason a slice is used in this
 statement is to make sure that the Java <strong>String</strong> has really been converted to
 a Python string, which can also be treated as an array of characters.</p>
-<p>You can see that it&#8217;s possible, using <strong>exec( )</strong>, to create a Python function
-(although it&#8217;s a bit awkward). The <strong>prt( )</strong> function prints the whole array,
+<p>You can see that it&#8217;s possible, using <strong>exec()</strong>, to create a Python function
+(although it&#8217;s a bit awkward). The <strong>prt()</strong> function prints the whole array,
 and then (to make sure it&#8217;s a real Python array), iterates through each element
 of the array and prints it. Finally, it prints the class of the array, so we can
 see what conversion has taken place (Python not only has run-time type
-information, it also has the equivalent of Java reflection). The <strong>prt( )</strong>
+information, it also has the equivalent of Java reflection). The <strong>prt()</strong>
 function is used to print arrays that come from each of the Java primitive
 types.</p>
-<p>Although a Java <strong>ArrayList</strong> does pass into the interpreter using <strong>set( )</strong>,
+<p>Although a Java <strong>ArrayList</strong> does pass into the interpreter using <strong>set()</strong>,
 and you can index into it as if it were an array, trying to create a slice
 fails. To completely convert it into an array, one approach is to simply extract
-a Java array using <strong>toArray( )</strong>, and pass that in. The <strong>set( )</strong> method
+a Java array using <strong>toArray()</strong>, and pass that in. The <strong>set()</strong> method
 converts it to a <strong>PyArray</strong> - one of the classes provided with Jython - which
 can be treated as a Python array (you can also explicitly create a <strong>PyArray</strong>,
 but this seems unnecessary).</p>
 <p>Finally, a <strong>Map</strong> is created and passed directly into the interpreter. While it
 is possible to do simple things like index into the resulting object, it&#8217;s not a
-real Python dictionary so you can&#8217;t (for example) call the <strong>keys( )</strong> method.
+real Python dictionary so you can&#8217;t (for example) call the <strong>keys()</strong> method.
 There is no straightforward way to convert a Java <strong>Map</strong> into a Python
-dictionary, and so I wrote a utility called <strong>toPyDictionary( )</strong> and made it a
+dictionary, and so I wrote a utility called <strong>toPyDictionary()</strong> and made it a
 <strong>static</strong> method of <strong>net.mindview.python.PyUtil</strong>. This also includes
 utilities to extract a Python array into a Java <strong>List</strong>, and a Python
 dictionary into a Java <strong>Map</strong>:</p>
 <div class="section" id="getting-data-out">
 <h3>Getting Data Out<a class="headerlink" href="#getting-data-out" title="Permalink to this headline">¶</a></h3>
 <p>There are a number of different ways to extract data from the
-<strong>PythonInterpreter</strong>. If you simply call the <strong>get( )</strong> method, passing it the
+<strong>PythonInterpreter</strong>. If you simply call the <strong>get()</strong> method, passing it the
 object identifier as a string, it returns a <strong>PyObject</strong> (part of the
 <strong>org.python.core</strong> support classes). It&#8217;s possible to &#8220;cast&#8221; it using the
-<strong>__tojava__( )</strong> method, but there are better alternatives:</p>
+<strong>__tojava__()</strong> method, but there are better alternatives:</p>
 <ol class="arabic simple">
-<li>The convenience methods in the <strong>Py</strong> class, such as <strong>py2int( )</strong>, take a
+<li>The convenience methods in the <strong>Py</strong> class, such as <strong>py2int()</strong>, take a
 <strong>PyObject</strong> and convert it to a number of different types.</li>
-<li>An overloaded version of <strong>get( )</strong> takes the desired Java <strong>Class</strong> object
+<li>An overloaded version of <strong>get()</strong> takes the desired Java <strong>Class</strong> object
 as a second argument, and produces an object that has that run-time type (so you
 still need to perform a cast on the result in your Java code).</li>
 </ol>
 quite easy. This is especially useful because Python is exceptionally good at
 manipulating strings and files, and so you will commonly want to extract the
 results as an array of strings. For example, you can do a wildcard expansion of
-file names using Python&#8217;s <strong>glob( )</strong>, as shown further down in the following
+file names using Python&#8217;s <strong>glob()</strong>, as shown further down in the following
 code:</p>
 <div class="highlight-java"><div class="highlight"><pre><span class="c">// Jython/PythonInterpreterGetting.java</span>
 <span class="c">// Getting data from the PythonInterpreter object.</span>
 </pre></div>
 </div>
 <p>The last two examples show the extraction of Python tuples and lists into Java
-<strong>List**s, and Python dictionaries into Java **Map**s. Both of these cases
+<strong>List</strong>s, and Python dictionaries into Java <strong>Map</strong>s. Both of these cases
 require more processing than is provided in the standard Jython library, so I
-have again created utilities in **net.mindview.pyton.PyUtil</strong>: <strong>toList( )</strong> to
-produce a <strong>List</strong> from a Python sequence, and <strong>toMap( )</strong> to produce a <strong>Map</strong>
+have again created utilities in <strong>net.mindview.pyton.PyUtil</strong>: <strong>toList()</strong> to
+produce a <strong>List</strong> from a Python sequence, and <strong>toMap()</strong> to produce a <strong>Map</strong>
 from a Python dictionary. The <strong>PyUtil</strong> methods make it easier to take
 important data structures back and forth between Java and Python.</p>
 </div>
 each <strong>PythonInterpreter</strong>.</p>
 </div>
 </div>
-<div class="section" id="controlling-java-from-jython">
-<h2>Controlling Java from Jython<a class="headerlink" href="#controlling-java-from-jython" title="Permalink to this headline">¶</a></h2>
-<p>Since you have the Java language at your disposal, and you can set and retrieve
-values in the interpreter, there&#8217;s a tremendous amount that you can accomplish
-with the above approach (controlling Python from Java).  But one of the amazing
-things about Jython is that it makes Java classes almost transparently available
-from within Jython. Basically, a Java class looks like a Python class. This is
-true for standard Java library classes as well as classes that you create
-yourself, as you can see here:</p>
-<div class="highlight-python"><div class="highlight"><pre><span class="c"># Jython/JavaClassInPython.py</span>
-<span class="c"># run with: jython.bat JavaClassInPython.py</span>
-<span class="c"># Using Java classes within Jython</span>
-<span class="k">from</span> <span class="nn">java.util</span> <span class="k">import</span> <span class="n">Date</span><span class="p">,</span> <span class="n">HashSet</span><span class="p">,</span> <span class="n">HashMap</span>
-<span class="k">from</span> <span class="nn">Jython.javaclass</span> <span class="k">import</span> <span class="n">JavaClass</span>
-<span class="k">from</span> <span class="nn">math</span> <span class="k">import</span> <span class="n">sin</span>
-
-<span class="n">d</span> <span class="o">=</span> <span class="n">Date</span><span class="p">()</span> <span class="c"># Creating a Java Date object</span>
-<span class="k">print</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="c"># Calls toString()</span>
-
-<span class="c"># A &quot;generator&quot; to easily create data:</span>
-<span class="k">class</span> <span class="nc">ValGen</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">maxVal</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">maxVal</span><span class="p">)</span>
-    <span class="c"># Called during &#39;for&#39; iteration:</span>
-    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
-        <span class="c"># Returns a tuple of two elements:</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">sin</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
-
-<span class="c"># Java standard containers:</span>
-<span class="nb">map</span> <span class="o">=</span> <span class="n">HashMap</span><span class="p">()</span>
-<span class="n">set</span> <span class="o">=</span> <span class="n">HashSet</span><span class="p">()</span>
-
-<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">ValGen</span><span class="p">(</span><span class="mf">10</span><span class="p">):</span>
-    <span class="nb">map</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
-    <span class="n">set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
-    <span class="n">set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
-
-<span class="k">print</span><span class="p">(</span><span class="nb">map</span><span class="p">)</span>
-<span class="k">print</span><span class="p">(</span><span class="n">set</span><span class="p">)</span>
-
-<span class="c"># Iterating through a set:</span>
-<span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="n">set</span><span class="p">:</span>
-    <span class="k">print</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">z</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span>
-
-<span class="k">print</span><span class="p">(</span><span class="nb">map</span><span class="p">[</span><span class="mf">3</span><span class="p">])</span> <span class="c"># Uses Python dictionary indexing</span>
-<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">map</span><span class="o">.</span><span class="n">keySet</span><span class="p">():</span> <span class="c"># keySet() is a Map method</span>
-    <span class="k">print</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">map</span><span class="p">[</span><span class="n">x</span><span class="p">])</span>
-
-<span class="c"># Using a Java class that you create yourself is</span>
-<span class="c"># just as easy:</span>
-<span class="n">jc</span> <span class="o">=</span> <span class="n">JavaClass</span><span class="p">()</span>
-<span class="n">jc2</span> <span class="o">=</span> <span class="n">JavaClass</span><span class="p">(</span><span class="s">&quot;Created within Jython&quot;</span><span class="p">)</span>
-<span class="k">print</span><span class="p">(</span><span class="n">jc2</span><span class="o">.</span><span class="n">getVal</span><span class="p">())</span>
-<span class="n">jc</span><span class="o">.</span><span class="n">setVal</span><span class="p">(</span><span class="s">&quot;Using a Java class is trivial&quot;</span><span class="p">)</span>
-<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">getVal</span><span class="p">())</span>
-<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">getChars</span><span class="p">())</span>
-<span class="n">jc</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="s">&quot;Using bean properties&quot;</span>
-<span class="k">print</span><span class="p">(</span><span class="n">jc</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
-</pre></div>
-</div>
-<p>The &#8220;<strong>=M</strong>&#8221; comment is recognized by the makefile generator tool (that I
-created for this book) as a replacement makefile command. This will be used
-instead of the commands that the extraction tool would normally place in the
-makefile.</p>
-<p>Note that the <strong>import</strong> statements map to the Java package structure exactly as
-you would expect. In the first example, a <strong>Date( )</strong> object is created as if it
-were a native Python class, and printing this object just calls <strong>toString( )</strong>.</p>
-<p><strong>ValGen</strong> implements the concept of a &#8220;generator&#8221; which is used a great deal in
-the C++ STL (<em>Standard Template Library</em>, part of the Standard C++ Library). A
-generator is an object that produces a new object every time its &#8220;generation
-method&#8221; is called, and it is quite convenient for filling containers. Here, I
-wanted to use it in a <strong>for</strong> iteration, and so I needed the generation method
-to be the one that is called by the iteration process. This is a special method
-called <strong>__getitem__( )</strong>, which is actually the overloaded operator for
-indexing, &#8216;<strong>[ ]</strong>&#8216;. A <strong>for</strong> loop calls this method every time it wants to
-move the iteration forward, and when the elements run out, <strong>__getitem__( )</strong>
-throws an out-of-bounds exception and that signals the end of the <strong>for</strong> loop
-(in other languages, you would never use an exception for ordinary control flow,
-but in Python it seems to work quite well). This exception happens automatically
-when <strong>self.val[i]</strong> runs out of elements, so the <strong>__getitem__( )</strong> code turns
-out to be simple. The only complexity is that <strong>__getitem__( )</strong> appears to
-return <em>two</em> objects instead of just one. What Python does is automatically
-package multiple return values into a tuple, so you still only end up returning
-a single object (in C++ or Java you would have to create your own data structure
-to accomplish this). In addition, in the <strong>for</strong> loop where <strong>ValGen</strong> is used,
-Python automatically &#8220;unpacks&#8221; the tuple so that you can have multiple iterators
-in the <strong>for</strong>. These are the kinds of syntax simplifications that make Python
-so endearing.</p>
-<p>The <strong>map</strong> and <strong>set</strong> objects are instances of Java&#8217;s <strong>HashMap</strong> and
-<strong>HashSet</strong>, again created as if those classes were just native Python
-components. In the <strong>for</strong> loop, the <strong>put( )</strong> and <strong>add( )</strong> methods work just
-like they do in Java. Also, indexing into a Java <strong>Map</strong> uses the same notation
-as for dictionaries, but note that to iterate through the keys in a <strong>Map</strong> you
-must use the <strong>Map</strong> method <strong>keySet( )</strong> rather than the Python dictionary
-method <strong>keys( )</strong>.</p>
-<p>The final part of the example shows the use of a Java class that I created from
-scratch, to demonstrate how trivial it is. Notice also that Jython intuitively
-understands JavaBeans properties, since you can either use the <strong>getVal( )</strong> and
-<strong>setVal( )</strong> methods, or assign to and read from the equivalent <strong>val</strong>
-property. Also, <strong>getChars( )</strong> returns a <strong>Character[]</strong> in Java, and this
-becomes an array in Python.</p>
-<p>The easiest way to use Java classes that you create for use inside a Python
-program is to put them inside a package. Although Jython can also import
-unpackaged java classes (<strong>import JavaClass</strong>), all such unpackaged java classes
-will be treated as if they were defined in different packages so they can only
-see each other&#8217;s public methods.</p>
-<p>Java packages translate into Python modules, and Python must import a module in
-order to be able to use the Java class. Here is the Java code for <strong>JavaClass</strong>:</p>
-<div class="highlight-java"><div class="highlight"><pre><span class="c">// Jython/javaclass/JavaClass.java</span>
-<span class="k">package</span> <span class="n">Jython</span><span class="o">.</span><span class="na">javaclass</span><span class="o">;</span>
-<span class="k">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
-
-<span class="k">public</span> <span class="k">class</span> <span class="nc">JavaClass</span> <span class="o">{</span>
-  <span class="k">private</span> <span class="n">String</span> <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">;</span>
-  <span class="k">public</span> <span class="nf">JavaClass</span><span class="o">()</span> <span class="o">{</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;JavaClass()&quot;</span><span class="o">);</span>
-  <span class="o">}</span>
-  <span class="k">public</span> <span class="nf">JavaClass</span><span class="o">(</span><span class="n">String</span> <span class="n">a</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">s</span> <span class="o">=</span> <span class="n">a</span><span class="o">;</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;JavaClass(String)&quot;</span><span class="o">);</span>
-  <span class="o">}</span>
-  <span class="k">public</span> <span class="n">String</span> <span class="nf">getVal</span><span class="o">()</span> <span class="o">{</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;getVal()&quot;</span><span class="o">);</span>
-    <span class="k">return</span> <span class="n">s</span><span class="o">;</span>
-  <span class="o">}</span>
-  <span class="k">public</span> <span class="kt">void</span> <span class="nf">setVal</span><span class="o">(</span><span class="n">String</span> <span class="n">a</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;setVal()&quot;</span><span class="o">);</span>
-    <span class="n">s</span> <span class="o">=</span> <span class="n">a</span><span class="o">;</span>
-  <span class="o">}</span>
-  <span class="k">public</span> <span class="n">Character</span><span class="o">[]</span> <span class="n">getChars</span><span class="o">()</span> <span class="o">{</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;getChars()&quot;</span><span class="o">);</span>
-    <span class="n">Character</span><span class="o">[]</span> <span class="n">r</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Character</span><span class="o">[</span><span class="n">s</span><span class="o">.</span><span class="na">length</span><span class="o">()];</span>
-    <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">s</span><span class="o">.</span><span class="na">length</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span>
-      <span class="n">r</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Character</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">));</span>
-    <span class="k">return</span> <span class="n">r</span><span class="o">;</span>
-  <span class="o">}</span>
-  <span class="k">public</span> <span class="k">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">JavaClass</span>
-      <span class="n">x1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JavaClass</span><span class="o">(),</span>
-      <span class="n">x2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JavaClass</span><span class="o">(</span><span class="s">&quot;UnitTest&quot;</span><span class="o">);</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">x2</span><span class="o">.</span><span class="na">getVal</span><span class="o">());</span>
-    <span class="n">x1</span><span class="o">.</span><span class="na">setVal</span><span class="o">(</span><span class="s">&quot;SpamEggsSausageAndSpam&quot;</span><span class="o">);</span>
-    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">Arrays</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">x1</span><span class="o">.</span><span class="na">getChars</span><span class="o">()));</span>
-  <span class="o">}</span>
-<span class="o">}</span>
-</pre></div>
-</div>
-<p>You can see that this is just an ordinary Java class, without any awareness that
-it will be used in a Jython program. For this reason, one of the important uses
-of Jython is in testing Java code <a class="footnote-reference" href="#id4" id="id2">[2]</a>. Because Python is such a powerful,
-flexible, dynamic language it is an ideal tool for automated test frameworks,
-without making any changes to the Java code that&#8217;s being tested.</p>
-<div class="section" id="inner-classes">
-<h3>Inner Classes<a class="headerlink" href="#inner-classes" title="Permalink to this headline">¶</a></h3>
-<p>Inner classes becomes attributes on the class object. Instances of <strong>static</strong>
-inner classes can be created with the usual call:</p>
-<div class="highlight-python"><div class="highlight"><pre><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="o">.</span><span class="n">StaticInnerClass</span><span class="p">()</span>
-</pre></div>
-</div>
-<p>Non-<strong>static</strong> inner classes must have an outer class instance supplied
-explicitly as the first argument:</p>
-<div class="highlight-python"><div class="highlight"><pre><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="o">.</span><span class="n">InnerClass</span><span class="p">(</span><span class="n">com</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">JavaClass</span><span class="p">())</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="using-java-libraries">
-<h2>Using Java libraries<a class="headerlink" href="#using-java-libraries" title="Permalink to this headline">¶</a></h2>
-<p>Jython wraps the Java libraries so that any of them can be used directly or via
-inheritance. In addition, Python shorthand simplifies coding.</p>
-<p>As an example, consider the <strong>HTMLButton.java</strong> example from Chapter 9 of
-<em>Thinking in Java</em> (you presumably have already downloaded and installed the
-source code for that book from <a class="reference external" href="http://www.MindviewInc.com">www.MindviewInc.com</a>, since a number of examples in this book use
-libraries from that book). Here is its conversion to Jython:</p>
-<div class="highlight-python"><div class="highlight"><pre><span class="c"># Jython/PythonSwing.py</span>
-<span class="c"># The HTMLButton.java example from &quot;Thinking in Java&quot;</span>
-<span class="c"># converted into Jython.</span>
-<span class="k">from</span> <span class="nn">javax.swing</span> <span class="k">import</span> <span class="n">JFrame</span><span class="p">,</span> <span class="n">JButton</span><span class="p">,</span> <span class="n">JLabel</span>
-<span class="k">from</span> <span class="nn">java.awt</span> <span class="k">import</span> <span class="n">FlowLayout</span>
-
-<span class="n">frame</span> <span class="o">=</span> <span class="n">JFrame</span><span class="p">(</span><span class="s">&quot;HTMLButton&quot;</span><span class="p">,</span> <span class="n">visible</span><span class="o">=</span><span class="mf">1</span><span class="p">,</span>
-  <span class="n">defaultCloseOperation</span><span class="o">=</span><span class="n">JFrame</span><span class="o">.</span><span class="n">EXIT_ON_CLOSE</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">kapow</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
-    <span class="n">frame</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
-      <span class="n">JLabel</span><span class="p">(</span><span class="s">&quot;&lt;html&gt;&lt;i&gt;&lt;font size=+4&gt;Kapow!&quot;</span><span class="p">))</span>
-    <span class="c"># Force a re-layout to include the new label:</span>
-    <span class="n">frame</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span>
-
-<span class="n">button</span> <span class="o">=</span> <span class="n">JButton</span><span class="p">(</span><span class="s">&quot;&lt;html&gt;&lt;b&gt;&lt;font size=+2&gt;&quot;</span> <span class="o">+</span>
-  <span class="s">&quot;&lt;center&gt;Hello!&lt;br&gt;&lt;i&gt;Press me now!&quot;</span><span class="p">,</span>
-  <span class="n">actionPerformed</span><span class="o">=</span><span class="n">kapow</span><span class="p">)</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">layout</span> <span class="o">=</span> <span class="n">FlowLayout</span><span class="p">()</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">button</span><span class="p">)</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">size</span><span class="o">=</span><span class="mf">200</span><span class="p">,</span> <span class="mf">500</span>
-</pre></div>
-</div>
-<p>If you compare the Java version of the program to the above Jython
-implementation, you&#8217;ll see that Jython is shorter and generally easier to
-understand. For example, in the Java version to set up the frame you had to make
-several calls: the constructor for <strong>JFrame( )</strong>, the <strong>setVisible( )</strong> method
-and the <strong>setDefaultCloseOperation( )</strong> method, whereas in the above code all
-three of these operations are performed with a single constructor call.</p>
-<p>Also notice that the <strong>JButton</strong> is configured with an <strong>actionListener( )</strong>
-method inside the constructor, with the assignment to <strong>kapow</strong>. In addition,
-Jython&#8217;s JavaBean awareness means that a call to any method with a name that
-begins with &#8220;<strong>set</strong>&#8221; can be replaced with an assignment, as you can see above.</p>
-<p>The only method that did not come over from Java is the <strong>pack( )</strong> method,
-which seems to be essential in order to force the layout to happen properly.
-It&#8217;s also important that the call to <strong>pack( )</strong> appear <em>before</em> the <strong>size</strong>
-setting.</p>
-<div class="section" id="inheriting-from-java-library-classes">
-<h3>Inheriting from Java library Classes<a class="headerlink" href="#inheriting-from-java-library-classes" title="Permalink to this headline">¶</a></h3>
-<p>You can easily inherit from standard Java library classes in
-Jython. Here&#8217;s the <strong>Dialogs.java</strong> example from <em>Thinking in Java</em>,
-converted into Jython:</p>
-<div class="highlight-python"><div class="highlight"><pre><span class="c"># Jython/PythonDialogs.py</span>
-<span class="c"># Dialogs.java from &quot;Thinking in Java,&quot; converted into Jython.</span>
-<span class="k">from</span> <span class="nn">java.awt</span> <span class="k">import</span> <span class="n">FlowLayout</span>
-<span class="k">from</span> <span class="nn">javax.swing</span> <span class="k">import</span> <span class="n">JFrame</span><span class="p">,</span> <span class="n">JDialog</span><span class="p">,</span> <span class="n">JLabel</span>
-<span class="k">from</span> <span class="nn">javax.swing</span> <span class="k">import</span> <span class="n">JButton</span>
-
-<span class="k">class</span> <span class="nc">MyDialog</span><span class="p">(</span><span class="n">JDialog</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">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-      <span class="n">JDialog</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">title</span><span class="o">=</span><span class="s">&quot;My dialog&quot;</span><span class="p">,</span> <span class="n">modal</span><span class="o">=</span><span class="mf">1</span><span class="p">)</span>
-      <span class="bp">self</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">layout</span> <span class="o">=</span> <span class="n">FlowLayout</span><span class="p">()</span>
-      <span class="bp">self</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">JLabel</span><span class="p">(</span><span class="s">&quot;A dialog!&quot;</span><span class="p">))</span>
-      <span class="bp">self</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">JButton</span><span class="p">(</span><span class="s">&quot;OK&quot;</span><span class="p">,</span>
-          <span class="n">actionPerformed</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="bp">self</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">dispose</span><span class="p">()))</span>
-      <span class="bp">self</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
-
-<span class="n">frame</span> <span class="o">=</span> <span class="n">JFrame</span><span class="p">(</span><span class="s">&quot;Dialogs&quot;</span><span class="p">,</span> <span class="n">visible</span><span class="o">=</span><span class="mf">1</span><span class="p">,</span>
-               <span class="n">defaultCloseOperation</span><span class="o">=</span><span class="n">JFrame</span><span class="o">.</span><span class="n">EXIT_ON_CLOSE</span><span class="p">)</span>
-<span class="n">dlg</span> <span class="o">=</span> <span class="n">MyDialog</span><span class="p">()</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">contentPane</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
-    <span class="n">JButton</span><span class="p">(</span><span class="s">&quot;Press here to get a Dialog Box&quot;</span><span class="p">,</span>
-            <span class="n">actionPerformed</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">dlg</span><span class="o">.</span><span class="n">show</span><span class="p">()))</span>
-<span class="n">frame</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
-</pre></div>
-</div>
-<p><strong>MyDialog</strong> is inherited from <strong>JDialog</strong>, and you can see named arguments
-being used in the call to the base-class constructor.</p>
-<p>In the creation of the &#8220;OK&#8221; <strong>JButton</strong>, note that the <strong>actionPerformed</strong>
-method is set right inside the constructor, and that the function is created
-using the Python <strong>lambda</strong> keyword. This creates a nameless function with the
-arguments appearing before the colon and the expression that generates the
-returned value after the colon. As you should know, the Java prototype for the
-<strong>actionPerformed( )</strong> method only contains a single argument, but the lambda
-expression indicates two. However, the second argument is provided with a
-default value, so the function <em>can</em> be called with only one argument. The
-reason for the second argument is seen in the default value, because this is a
-way to pass <strong>self</strong> into the lambda expression, so that it can be used to
-dispose of the dialog.</p>
-<p>Compare this code with the version that&#8217;s published in <em>Thinking in Java</em>.
-You&#8217;ll find that Python language features allow a much more succinct and direct
-implementation.</p>
-</div>
-</div>
 <div class="section" id="creating-java-classes-with-jython">
 <h2>Creating Java classes with Jython<a class="headerlink" href="#creating-java-classes-with-jython" title="Permalink to this headline">¶</a></h2>
 <div class="admonition note">
 <p class="first admonition-title">Note</p>
-<p class="last">Jython 2.5.0 does not support jythonc. Support is planned
-for 2.5.1. jythonc basically converted python source to java
-source, the replacement will generate bytecodes directly,
-and enable jython code to be imported directly into java
-(via generated proxies).</p>
+<p class="last">Jython 2.5.0 does not support <strong>jythonc</strong>. Support is
+planned for 2.5.1. <strong>jythonc</strong> basically converted python
+source to java source, the replacement will generate
+bytecodes directly, and enable jython code to be imported
+directly into java (via generated proxies).</p>
 </div>
 <p>Jython can also create Java classes directly from your Jython
 code. This can produce very useful results, as you are then able to
 functions and methods are dynamically typed. Thus, you must somehow
 tell <strong>jythonc</strong> that a Python method is intended to have a particular
 set of argument types and that its return value is a particular
-type. You accomplish this with the &#8220;&#64;sig&#8221; string, which is placed
+type. You accomplish this with the <strong>&#64;sig</strong> string, which is placed
 right after the beginning of the Python method definition (this is the
 standard location for the Python documentation string). For example:</p>
 <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">returnArray</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 provide you with enough examples that you&#8217;ll be able to easily create your own
 signature strings. The first three of these are fairly self-explanatory, but
 note the full qualification of the Java name in the signature string.</p>
-<p>In <strong>returnArray( )</strong>, a Python array must be returned as a Java array. To do
-this, the Jython <strong>array( )</strong> function (from the <strong>jarray</strong> module) must be
+<p>In <strong>returnArray()</strong>, a Python array must be returned as a Java array. To do
+this, the Jython <strong>array()</strong> function (from the <strong>jarray</strong> module) must be
 used, along with the type of the class for the resulting array. Any time you
-need to return an array to Java, you must use <strong>array( )</strong>, as seen in the
-methods <strong>ints( )</strong> and <strong>doubles( )</strong>.</p>
+need to return an array to Java, you must use <strong>array()</strong>, as seen in the
+methods <strong>ints()</strong> and <strong>doubles()</strong>.</p>
 <p>The last methods show how to pass arguments in from Java. Basic types happen
 automatically as long as you specify them in the <strong>&#64;sig</strong> string, but you must
 use objects and you cannot pass in primitives (that is, primitives must be
 ensconced in wrapper objects, such as <strong>Integer</strong>).</p>
-<p>In <strong>argIn3( )</strong>, you can see that a Java <strong>List</strong> is transparently converted to
+<p>In <strong>argIn3()</strong>, you can see that a Java <strong>List</strong> is transparently converted to
 something that behaves just like a Python array, but is not a true array because
 you cannot take a slice from it. If you want a true Python array, then you must
-create and pass a <strong>PyArray</strong> as in <strong>argIn4( )</strong>, where the slice is
+create and pass a <strong>PyArray</strong> as in <strong>argIn4()</strong>, where the slice is
 successful. Similarly, a Java <strong>Map</strong> must come in as a <strong>PyDictionary</strong> in
 order to be treated as a Python dictionary.</p>
 <p>Here is the Java program to exercise the Java classes produced by the
 <p>For Python support, you&#8217;ll usually only need to import the classes in
 <strong>org.python.core</strong>. Everything else in the above example is fairly
 straightforward, as <strong>PythonToJavaClass</strong> appears, from the Java side, to be
-just another Java class. <strong>dumpClassInfo( )</strong> uses reflection to verify that the
+just another Java class. <strong>dumpClassInfo()</strong> uses reflection to verify that the
 method signatures specified in <strong>PythonToJavaClass.py</strong> have come through
 properly.</p>
 <div class="section" id="building-java-classes-from-python">
 the <strong>JTextArea</strong> (which should scroll). You&#8217;ll need to locate the
 <strong>PythonInterpreter</strong> command that redirects the output to a Java stream.</li>
 <li>Modify <strong>GreenHouseLanguage.py</strong> to add a master controller class (instead
-of the static array inside <strong>Event</strong>) and provide a <strong>run( )</strong> method for
-each of the subclasses. Each <strong>run( )</strong> should create and use an object from
+of the static array inside <strong>Event</strong>) and provide a <strong>run()</strong> method for
+each of the subclasses. Each <strong>run()</strong> should create and use an object from
 the standard Java library during its execution. Modify
 <strong>GreenHouseController.java</strong> to use this new class.</li>
 <li>Modify the resulting <strong>GreenHouseLanguage.py</strong> from exercise two to produce
 </li>
 <li><a class="reference external" href="#scripting">Scripting</a></li>
 <li><a class="reference external" href="#creating-a-language">Creating a Language</a></li>
+<li><a class="reference external" href="#controlling-java-from-jython">Controlling Java from Jython</a><ul>
+<li><a class="reference external" href="#inner-classes">Inner Classes</a></li>
+</ul>
+</li>
 <li><a class="reference external" href="#controlling-the-interpreter">Controlling the Interpreter</a><ul>
 <li><a class="reference external" href="#putting-data-in">Putting Data In</a></li>
 <li><a class="reference external" href="#getting-data-out">Getting Data Out</a></li>
 <li><a class="reference external" href="#multiple-interpreters">Multiple Interpreters</a></li>
 </ul>
 </li>
-<li><a class="reference external" href="#controlling-java-from-jython">Controlling Java from Jython</a><ul>
-<li><a class="reference external" href="#inner-classes">Inner Classes</a></li>
-</ul>
-</li>
-<li><a class="reference external" href="#using-java-libraries">Using Java libraries</a><ul>
-<li><a class="reference external" href="#inheriting-from-java-library-classes">Inheriting from Java library Classes</a></li>
-</ul>
-</li>
 <li><a class="reference external" href="#creating-java-classes-with-jython">Creating Java classes with Jython</a><ul>
 <li><a class="reference external" href="#building-java-classes-from-python">Building Java Classes from Python</a></li>
 </ul>

html/_sources/Jython.txt

-
 
 ********************************************************************************
 Jython
 The download is a **.class** file, which will run an installer when
 you execute it with Java.
 
-You also need to add **jython-complete.jar** to your Java CLASSPATH.
-As an example, here is the appropriate section in my ``.bashrc``::
+You also need the Java Development Kit (JDK), and to add
+**jython-complete.jar** to your Java CLASSPATH.  As an example, here
+is the appropriate section in my ``.bashrc`` for **\*nix**; for Windows you
+need to do the equivalent::
 
    export set JYTHON_HOME="/Users/bruceeckel/jython2.5b0"
    export set CLASSPATH=.:..:$JYTHON_HOME/jython-complete.jar
 
-When you run Jython, you might get the error: ``can't create package
-cache dir, '/cachedir/packages'``. Jython caching requires
-``/cachedir/packages/`` in the ``python.home`` directory. It is often
-the case on \*nix that users lack sufficient priveledges to create or
-write to this directory. Because the problem is merely permissions,
-something like ``mkdir cachedir; chmod a+rw cachedir`` within the
-Jython directory should eliminate this error message.
+When you run Jython, you might get the warning: ``can't create package
+cache dir, '/cachedir/packages'``. Jython will still work, but startup
+will be slower because caching isn't happening. Jython caching
+requires ``/cachedir/packages/`` in the ``python.home`` directory. It
+is often the case on **\*nix** that users lack sufficient priveleges to
+create or write to this directory. Because the problem is merely
+permissions, something like ``mkdir cachedir; chmod a+rw cachedir``
+within the Jython directory should eliminate this warning message.
 
 Getting the Trunk
 -----------------------------------------------------------------------
    	  ``jython GreenHouseLanguage.py``.
 
 The constructor of each derived class calls the base-class constructor, which
-adds the new object to the list. The **run( )** function sorts the list, which
-automatically uses the **__cmp__( )** method that was defined in **Event** to
+adds the new object to the list. The **run()** function sorts the list, which
+automatically uses the **__cmp__()** method that was defined in **Event** to
 base comparisons on time only. In this example, it only prints out the list, but
 in the real system it would wait for the time of each event to come up and then
 run the event.
 
 
 The **PythonInterpreter** object is a complete Python interpreter that accepts
-commands from the Java program. One of these commands is **execfile( )**, which
+commands from the Java program. One of these commands is **execfile()**, which
 tells it to execute all the statements it finds in a particular file. By
 executing **GreenHouseLanguage.py**, all the classes from that file are loaded
 into our **PythonInterpreter** object, and so it now "holds" the greenhouse
     LightOff(2.00)
     WaterOff(4.45)
 
-
 This is the goal of the interpreter design pattern: to make the configuration of
 your program as simple as possible for the end user. With Jython you can achieve
 this with almost no effort at all.
 
 One of the other methods available to the **PythonInterpreter** is
-**exec( )**, which allows you to send a command to the interpreter. In
-the above program, the **run( )** function is called using **exec()**.
+**exec()**, which allows you to send a command to the interpreter. In
+the above program, the **run()** function is called using **exec()**.
+
+Controlling Java from Jython
+=======================================================================
+
+Since you have the Java language at your disposal, and you can set and retrieve
+values in the interpreter, there's a tremendous amount that you can accomplish
+with the above approach (controlling Python from Java).  But one of the amazing
+things about Jython is that it makes Java classes almost transparently available
+from within Jython. Basically, a Java class looks like a Python class. This is
+true for standard Java library classes as well as classes that you create
+yourself, as you can see here::
+
+    # Jython/JavaClassInPython.py
+    # run with: jython.bat JavaClassInPython.py
+    # Using Java classes within Jython
+    from java.util import Date, HashSet, HashMap
+    from Jython.javaclass import JavaClass
+    from math import sin
+
+    d = Date() # Creating a Java Date object
+    print(d) # Calls toString()
+
+    # A "generator" to easily create data:
+    class ValGen:
+        def __init__(self, maxVal):
+            self.val = range(maxVal)
+        # Called during 'for' iteration:
+        def __getitem__(self, i):
+            # Returns a tuple of two elements:
+            return self.val[i], sin(self.val[i])
+
+    # Java standard containers:
+    map = HashMap()
+    set = HashSet()
+
+    for x, y in ValGen(10):
+        map.put(x, y)
+        set.add(y)
+        set.add(y)
+
+    print(map)
+    print(set)
+
+    # Iterating through a set:
+    for z in set:
+        print(z, z.__class__)
+
+    print(map[3]) # Uses Python dictionary indexing
+    for x in map.keySet(): # keySet() is a Map method
+        print(x, map[x])
+
+    # Using a Java class that you create yourself is
+    # just as easy:
+    jc = JavaClass()
+    jc2 = JavaClass("Created within Jython")
+    print(jc2.getVal())
+    jc.setVal("Using a Java class is trivial")
+    print(jc.getVal())
+    print(jc.getChars())
+    jc.val = "Using bean properties"
+    print(jc.val)
+
+Note that the **import** statements map to the Java package structure exactly as
+you would expect. In the first example, a **Date()** object is created as if it
+were a native Python class, and printing this object just calls **toString()**.
+
+**ValGen** implements the concept of a "generator" which is used a great deal in
+the C++ STL (*Standard Template Library*, part of the Standard C++ Library). A
+generator is an object that produces a new object every time its "generation
+method" is called, and it is quite convenient for filling containers. Here, I
+wanted to use it in a **for** iteration, and so I needed the generation method
+to be the one that is called by the iteration process. This is a special method
+called **__getitem__()**, which is actually the overloaded operator for
+indexing, '**[ ]**'. A **for** loop calls this method every time it wants to
+move the iteration forward, and when the elements run out, **__getitem__()**
+throws an out-of-bounds exception and that signals the end of the **for** loop
+(in other languages, you would never use an exception for ordinary control flow,
+but in Python it seems to work quite well). This exception happens automatically
+when **self.val[i]** runs out of elements, so the **__getitem__()** code turns
+out to be simple. The only complexity is that **__getitem__()** appears to
+return *two* objects instead of just one. What Python does is automatically
+package multiple return values into a tuple, so you still only end up returning
+a single object (in C++ or Java you would have to create your own data structure
+to accomplish this). In addition, in the **for** loop where **ValGen** is used,
+Python automatically "unpacks" the tuple so that you can have multiple iterators
+in the **for**. These are the kinds of syntax simplifications that make Python
+so endearing.
+
+The **map** and **set** objects are instances of Java's **HashMap** and
+**HashSet**, again created as if those classes were just native Python
+components. In the **for** loop, the **put()** and **add()** methods work just
+like they do in Java. Also, indexing into a Java **Map** uses the same notation
+as for dictionaries, but note that to iterate through the keys in a **Map** you
+must use the **Map** method **keySet()** rather than the Python dictionary
+method **keys()**.
+
+The final part of the example shows the use of a Java class that I created from
+scratch, to demonstrate how trivial it is. Notice also that Jython intuitively
+understands JavaBeans properties, since you can either use the **getVal()** and
+**setVal()** methods, or assign to and read from the equivalent **val**
+property. Also, **getChars()** returns a **Character[]** in Java, and this
+becomes an array in Python.
+
+The easiest way to use Java classes that you create for use inside a Python
+program is to put them inside a package. Although Jython can also import
+unpackaged java classes (**import JavaClass**), all such unpackaged java classes
+will be treated as if they were defined in different packages so they can only
+see each other's public methods.
+
+Java packages translate into Python modules, and Python must import a module in
+order to be able to use the Java class. Here is the Java code for **JavaClass**:
+
+..  code-block:: java
+
+    // Jython/javaclass/JavaClass.java
+    package Jython.javaclass;
+    import java.util.*;
+
+    public class JavaClass {
+      private String s = "";
+      public JavaClass() {
+        System.out.println("JavaClass()");
+      }
+      public JavaClass(String a) {
+        s = a;
+        System.out.println("JavaClass(String)");
+      }
+      public String getVal() {
+        System.out.println("getVal()");
+        return s;
+      }
+      public void setVal(String a) {
+        System.out.println("setVal()");
+        s = a;
+      }
+      public Character[] getChars() {
+        System.out.println("getChars()");
+        Character[] r = new Character[s.length()];
+        for(int i = 0; i < s.length(); i++)
+          r[i] = new Character(s.charAt(i));
+        return r;
+      }
+      public static void main(String[] args) {
+        JavaClass
+          x1 = new JavaClass(),
+          x2 = new JavaClass("UnitTest");
+        System.out.println(x2.getVal());
+        x1.setVal("SpamEggsSausageAndSpam");
+        System.out.println(Arrays.toString(x1.getChars()));
+      }
+    }
+
+You can see that this is just an ordinary Java class, without any awareness that
+it will be used in a Jython program. For this reason, one of the important uses
+of Jython is in testing Java code [#]_. Because Python is such a powerful,
+flexible, dynamic language it is an ideal tool for automated test frameworks,
+without making any changes to the Java code that's being tested.
+
+Inner Classes
+------------------------------------------------------------------------------
+
+Inner classes becomes attributes on the class object. Instances of **static**
+inner classes can be created with the usual call::
+
+    com.foo.JavaClass.StaticInnerClass()
+
+Non-**static** inner classes must have an outer class instance supplied
+explicitly as the first argument::
+
+    com.foo.JavaClass.InnerClass(com.foo.JavaClass())
 
 Controlling the Interpreter
 =======================================================================
 
-The prior example only creates and runs the interpreter using external scripts.
 In the rest of this chapter, we shall look at more sophisticated ways to
 interact with Jython. The simplest way to exercise more control over the
 **PythonInterpreter** object from within Java is to send data to the
 --------------------------------------------------------------------------------
 
 To inject data into your Python program, the **PythonInterpreter** class has a
-deceptively simple method: **set( )**. However, **set( )** takes many different
+deceptively simple method: **set()**. However, **set()** takes many different
 data types and performs conversions upon them.  The following example is a
-reasonably thorough exercise of the various **set( )** possibilities, along with
+reasonably thorough exercise of the various **set()** possibilities, along with
 comments that should give a fairly complete explanation:
 
 ..  code-block:: java
       }
     }
 
-
 As usual with Java, the distinction between real objects and primitive types
-causes trouble. In general, if you pass a regular object to **set( )**, it knows
+causes trouble. In general, if you pass a regular object to **set()**, it knows
 what to do with it, but if you want to pass in a primitive you must perform a
 conversion. One way to do this is to create a "Py" type, such as **PyInteger**
 or **PyFloat**. but it turns out you can also use Java's own object wrappers
 like **Integer** and **Float**, which is probably going to be a lot easier to
 remember.
 
-Early in the program you'll see an **exec( )** containing the Python statement::
+Early in the program you'll see an **exec()** containing the Python statement::
 
     print(a[5:])
 
 statement is to make sure that the Java **String** has really been converted to
 a Python string, which can also be treated as an array of characters.
 
-You can see that it's possible, using **exec( )**, to create a Python function
-(although it's a bit awkward). The **prt( )** function prints the whole array,
+You can see that it's possible, using **exec()**, to create a Python function
+(although it's a bit awkward). The **prt()** function prints the whole array,
 and then (to make sure it's a real Python array), iterates through each element
 of the array and prints it. Finally, it prints the class of the array, so we can
 see what conversion has taken place (Python not only has run-time type
-information, it also has the equivalent of Java reflection). The **prt( )**
+information, it also has the equivalent of Java reflection). The **prt()**
 function is used to print arrays that come from each of the Java primitive
 types.
 
-Although a Java **ArrayList** does pass into the interpreter using **set( )**,
+Although a Java **ArrayList** does pass into the interpreter using **set()**,
 and you can index into it as if it were an array, trying to create a slice
 fails. To completely convert it into an array, one approach is to simply extract
-a Java array using **toArray( )**, and pass that in. The **set( )** method
+a Java array using **toArray()**, and pass that in. The **set()** method
 converts it to a **PyArray** - one of the classes provided with Jython - which
 can be treated as a Python array (you can also explicitly create a **PyArray**,
 but this seems unnecessary).
 
 Finally, a **Map** is created and passed directly into the interpreter. While it
 is possible to do simple things like index into the resulting object, it's not a
-real Python dictionary so you can't (for example) call the **keys( )** method.
+real Python dictionary so you can't (for example) call the **keys()** method.
 There is no straightforward way to convert a Java **Map** into a Python
-dictionary, and so I wrote a utility called **toPyDictionary( )** and made it a
+dictionary, and so I wrote a utility called **toPyDictionary()** and made it a
 **static** method of **net.mindview.python.PyUtil**. This also includes
 utilities to extract a Python array into a Java **List**, and a Python
 dictionary into a Java **Map**:
 --------------------------------------------------------------------------------
 
 There are a number of different ways to extract data from the
-**PythonInterpreter**. If you simply call the **get( )** method, passing it the
+**PythonInterpreter**. If you simply call the **get()** method, passing it the
 object identifier as a string, it returns a **PyObject** (part of the
 **org.python.core** support classes). It's possible to "cast" it using the
-**__tojava__( )** method, but there are better alternatives:
+**__tojava__()** method, but there are better alternatives:
 
 
-1.  The convenience methods in the **Py** class, such as **py2int( )**, take a
+1.  The convenience methods in the **Py** class, such as **py2int()**, take a
     **PyObject** and convert it to a number of different types.
 
-2.  An overloaded version of **get( )** takes the desired Java **Class** object
+2.  An overloaded version of **get()** takes the desired Java **Class** object
     as a second argument, and produces an object that has that run-time type (so you
     still need to perform a cast on the result in your Java code).
 
 quite easy. This is especially useful because Python is exceptionally good at
 manipulating strings and files, and so you will commonly want to extract the
 results as an array of strings. For example, you can do a wildcard expansion of
-file names using Python's **glob( )**, as shown further down in the following
+file names using Python's **glob()**, as shown further down in the following
 code:
 
 ..  code-block:: java
       }
     }
 
-
 The last two examples show the extraction of Python tuples and lists into Java
-**List**s, and Python dictionaries into Java **Map**s. Both of these cases
+**List**\s, and Python dictionaries into Java **Map**\s. Both of these cases
 require more processing than is provided in the standard Jython library, so I
-have again created utilities in **net.mindview.pyton.PyUtil**: **toList( )** to
-produce a **List** from a Python sequence, and **toMap( )** to produce a **Map**
+have again created utilities in **net.mindview.pyton.PyUtil**: **toList()** to
+produce a **List** from a Python sequence, and **toMap()** to produce a **Map**
 from a Python dictionary. The **PyUtil** methods make it easier to take
 important data structures back and forth between Java and Python.
 
 When you run the program you'll see that the value of **a** is distinct within
 each **PythonInterpreter**.
 
-Controlling Java from Jython
-=======================================================================
-
-Since you have the Java language at your disposal, and you can set and retrieve
-values in the interpreter, there's a tremendous amount that you can accomplish
-with the above approach (controlling Python from Java).  But one of the amazing
-things about Jython is that it makes Java classes almost transparently available
-from within Jython. Basically, a Java class looks like a Python class. This is
-true for standard Java library classes as well as classes that you create
-yourself, as you can see here::
-
-    # Jython/JavaClassInPython.py
-    # run with: jython.bat JavaClassInPython.py
-    # Using Java classes within Jython
-    from java.util import Date, HashSet, HashMap
-    from Jython.javaclass import JavaClass
-    from math import sin
-
-    d = Date() # Creating a Java Date object
-    print(d) # Calls toString()
-
-    # A "generator" to easily create data:
-    class ValGen:
-        def __init__(self, maxVal):
-            self.val = range(maxVal)
-        # Called during 'for' iteration:
-        def __getitem__(self, i):
-            # Returns a tuple of two elements:
-            return self.val[i], sin(self.val[i])
-
-    # Java standard containers:
-    map = HashMap()
-    set = HashSet()
-
-    for x, y in ValGen(10):
-        map.put(x, y)
-        set.add(y)
-        set.add(y)
-
-    print(map)
-    print(set)
-
-    # Iterating through a set:
-    for z in set:
-        print(z, z.__class__)
-
-    print(map[3]) # Uses Python dictionary indexing
-    for x in map.keySet(): # keySet() is a Map method
-        print(x, map[x])
-
-    # Using a Java class that you create yourself is
-    # just as easy:
-    jc = JavaClass()
-    jc2 = JavaClass("Created within Jython")
-    print(jc2.getVal())
-    jc.setVal("Using a Java class is trivial")
-    print(jc.getVal())
-    print(jc.getChars())
-    jc.val = "Using bean properties"
-    print(jc.val)
-
-
-The "**=M**" comment is recognized by the makefile generator tool (that I
-created for this book) as a replacement makefile command. This will be used
-instead of the commands that the extraction tool would normally place in the
-makefile.
-
-Note that the **import** statements map to the Java package structure exactly as
-you would expect. In the first example, a **Date( )** object is created as if it
-were a native Python class, and printing this object just calls **toString( )**.
-
-**ValGen** implements the concept of a "generator" which is used a great deal in
-the C++ STL (*Standard Template Library*, part of the Standard C++ Library). A
-generator is an object that produces a new object every time its "generation
-method" is called, and it is quite convenient for filling containers. Here, I
-wanted to use it in a **for** iteration, and so I needed the generation method
-to be the one that is called by the iteration process. This is a special method
-called **__getitem__( )**, which is actually the overloaded operator for
-indexing, '**[ ]**'. A **for** loop calls this method every time it wants to
-move the iteration forward, and when the elements run out, **__getitem__( )**
-throws an out-of-bounds exception and that signals the end of the **for** loop
-(in other languages, you would never use an exception for ordinary control flow,
-but in Python it seems to work quite well). This exception happens automatically
-when **self.val[i]** runs out of elements, so the **__getitem__( )** code turns
-out to be simple. The only complexity is that **__getitem__( )** appears to
-return *two* objects instead of just one. What Python does is automatically
-package multiple return values into a tuple, so you still only end up returning
-a single object (in C++ or Java you would have to create your own data structure
-to accomplish this). In addition, in the **for** loop where **ValGen** is used,
-Python automatically "unpacks" the tuple so that you can have multiple iterators
-in the **for**. These are the kinds of syntax simplifications that make Python
-so endearing.
-
-The **map** and **set** objects are instances of Java's **HashMap** and
-**HashSet**, again created as if those classes were just native Python
-components. In the **for** loop, the **put( )** and **add( )** methods work just
-like they do in Java. Also, indexing into a Java **Map** uses the same notation
-as for dictionaries, but note that to iterate through the keys in a **Map** you
-must use the **Map** method **keySet( )** rather than the Python dictionary
-method **keys( )**.
-
-The final part of the example shows the use of a Java class that I created from
-scratch, to demonstrate how trivial it is. Notice also that Jython intuitively
-understands JavaBeans properties, since you can either use the **getVal( )** and
-**setVal( )** methods, or assign to and read from the equivalent **val**
-property. Also, **getChars( )** returns a **Character[]** in Java, and this
-becomes an array in Python.
-
-The easiest way to use Java classes that you create for use inside a Python
-program is to put them inside a package. Although Jython can also import
-unpackaged java classes (**import JavaClass**), all such unpackaged java classes
-will be treated as if they were defined in different packages so they can only
-see each other's public methods.
-
-Java packages translate into Python modules, and Python must import a module in
-order to be able to use the Java class. Here is the Java code for **JavaClass**:
-
-..  code-block:: java
-
-    // Jython/javaclass/JavaClass.java
-    package Jython.javaclass;
-    import java.util.*;
-
-    public class JavaClass {
-      private String s = "";
-      public JavaClass() {
-        System.out.println("JavaClass()");
-      }
-      public JavaClass(String a) {
-        s = a;
-        System.out.println("JavaClass(String)");
-      }
-      public String getVal() {
-        System.out.println("getVal()");
-        return s;
-      }
-      public void setVal(String a) {
-        System.out.println("setVal()");
-        s = a;
-      }
-      public Character[] getChars() {
-        System.out.println("getChars()");
-        Character[] r = new Character[s.length()];
-        for(int i = 0; i < s.length(); i++)
-          r[i] = new Character(s.charAt(i));
-        return r;
-      }
-      public static void main(String[] args) {
-        JavaClass
-          x1 = new JavaClass(),
-          x2 = new JavaClass("UnitTest");
-        System.out.println(x2.getVal());
-        x1.setVal("SpamEggsSausageAndSpam");
-        System.out.println(Arrays.toString(x1.getChars()));
-      }
-    }
-
-
-You can see that this is just an ordinary Java class, without any awareness that
-it will be used in a Jython program. For this reason, one of the important uses
-of Jython is in testing Java code [#]_. Because Python is such a powerful,
-flexible, dynamic language it is an ideal tool for automated test frameworks,
-without making any changes to the Java code that's being tested.
-
-Inner Classes
-------------------------------------------------------------------------------
-
-Inner classes becomes attributes on the class object. Instances of **static**
-inner classes can be created with the usual call::
-
-    com.foo.JavaClass.StaticInnerClass()
-
-Non-**static** inner classes must have an outer class instance supplied
-explicitly as the first argument::
-
-    com.foo.JavaClass.InnerClass(com.foo.JavaClass())
-
-Using Java libraries
-=======================================================================
-
-Jython wraps the Java libraries so that any of them can be used directly or via
-inheritance. In addition, Python shorthand simplifies coding.
-
-As an example, consider the **HTMLButton.java** example from Chapter 9 of
-*Thinking in Java* (you presumably have already downloaded and installed the
-source code for that book from `www.MindviewInc.com
-<http://www.MindviewInc.com>`_, since a number of examples in this book use
-libraries from that book). Here is its conversion to Jython::
-
-    # Jython/PythonSwing.py
-    # The HTMLButton.java example from "Thinking in Java"
-    # converted into Jython.
-    from javax.swing import JFrame, JButton, JLabel
-    from java.awt import FlowLayout
-
-    frame = JFrame("HTMLButton", visible=1,
-      defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
-
-    def kapow(e):
-        frame.contentPane.add(
-          JLabel("<html><i><font size=+4>Kapow!"))
-        # Force a re-layout to include the new label:
-        frame.validate()
-
-    button = JButton("<html><b><font size=+2>" +
-      "<center>Hello!<br><i>Press me now!",
-      actionPerformed=kapow)
-    frame.contentPane.layout = FlowLayout()
-    frame.contentPane.add(button)
-    frame.pack()
-    frame.size=200, 500
-
-
-If you compare the Java version of the program to the above Jython
-implementation, you'll see that Jython is shorter and generally easier to
-understand. For example, in the Java version to set up the frame you had to make
-several calls: the constructor for **JFrame( )**, the **setVisible( )** method
-and the **setDefaultCloseOperation( )** method, whereas in the above code all
-three of these operations are performed with a single constructor call.
-
-Also notice that the **JButton** is configured with an **actionListener( )**
-method inside the constructor, with the assignment to **kapow**. In addition,
-Jython's JavaBean awareness means that a call to any method with a name that
-begins with "**set**" can be replaced with an assignment, as you can see above.
-
-The only method that did not come over from Java is the **pack( )** method,
-which seems to be essential in order to force the layout to happen properly.
-It's also important that the call to **pack( )** appear *before* the **size**
-setting.
-
-Inheriting from Java library Classes
--------------------------------------------------------------------------------
-
-You can easily inherit from standard Java library classes in
-Jython. Here's the **Dialogs.java** example from *Thinking in Java*,
-converted into Jython::
-
-    # Jython/PythonDialogs.py
-    # Dialogs.java from "Thinking in Java," converted into Jython.
-    from java.awt import FlowLayout
-    from javax.swing import JFrame, JDialog, JLabel
-    from javax.swing import JButton
-
-    class MyDialog(JDialog):
-      def __init__(self, parent=None):
-          JDialog.__init__(self,
-                           title="My dialog", modal=1)
-          self.contentPane.layout = FlowLayout()
-          self.contentPane.add(JLabel("A dialog!"))
-          self.contentPane.add(JButton("OK",
-              actionPerformed = lambda e, t=self: t.dispose()))
-          self.pack()
-
-    frame = JFrame("Dialogs", visible=1,
-                   defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
-    dlg = MyDialog()
-    frame.contentPane.add(
-        JButton("Press here to get a Dialog Box",
-                actionPerformed = lambda e: dlg.show()))
-    frame.pack()
-
-
-**MyDialog** is inherited from **JDialog**, and you can see named arguments
-being used in the call to the base-class constructor.
-
-In the creation of the "OK" **JButton**, note that the **actionPerformed**
-method is set right inside the constructor, and that the function is created
-using the Python **lambda** keyword. This creates a nameless function with the
-arguments appearing before the colon and the expression that generates the
-returned value after the colon. As you should know, the Java prototype for the
-**actionPerformed( )** method only contains a single argument, but the lambda
-expression indicates two. However, the second argument is provided with a
-default value, so the function *can* be called with only one argument. The
-reason for the second argument is seen in the default value, because this is a
-way to pass **self** into the lambda expression, so that it can be used to
-dispose of the dialog.
-
-Compare this code with the version that's published in *Thinking in Java*.
-You'll find that Python language features allow a much more succinct and direct
-implementation.
-
 Creating Java classes with Jython
 =======================================================================
 
-.. note:: Jython 2.5.0 does not support jythonc. Support is planned
-   	  for 2.5.1. jythonc basically converted python source to java
-   	  source, the replacement will generate bytecodes directly,
-   	  and enable jython code to be imported directly into java
-   	  (via generated proxies).
+.. note:: Jython 2.5.0 does not support **jythonc**. Support is
+   	  planned for 2.5.1. **jythonc** basically converted python
+   	  source to java source, the replacement will generate
+   	  bytecodes directly, and enable jython code to be imported
+   	  directly into java (via generated proxies).
 
 Jython can also create Java classes directly from your Jython
 code. This can produce very useful results, as you are then able to
 functions and methods are dynamically typed. Thus, you must somehow
 tell **jythonc** that a Python method is intended to have a particular
 set of argument types and that its return value is a particular
-type. You accomplish this with the "@sig" string, which is placed
+type. You accomplish this with the **@sig** string, which is placed
 right after the beginning of the Python method definition (this is the
 standard location for the Python documentation string). For example::
 
 signature strings. The first three of these are fairly self-explanatory, but
 note the full qualification of the Java name in the signature string.
 
-In **returnArray( )**, a Python array must be returned as a Java array. To do
-this, the Jython **array( )** function (from the **jarray** module) must be
+In **returnArray()**, a Python array must be returned as a Java array. To do
+this, the Jython **array()** function (from the **jarray** module) must be
 used, along with the type of the class for the resulting array. Any time you
-need to return an array to Java, you must use **array( )**, as seen in the
-methods **ints( )** and **doubles( )**.
+need to return an array to Java, you must use **array()**, as seen in the
+methods **ints()** and **doubles()**.
 
 The last methods show how to pass arguments in from Java. Basic types happen
 automatically as long as you specify them in the **@sig** string, but you must
 use objects and you cannot pass in primitives (that is, primitives must be
 ensconced in wrapper objects, such as **Integer**).
 
-In **argIn3( )**, you can see that a Java **List** is transparently converted to
+In **argIn3()**, you can see that a Java **List** is transparently converted to
 something that behaves just like a Python array, but is not a true array because
 you cannot take a slice from it. If you want a true Python array, then you must
-create and pass a **PyArray** as in **argIn4( )**, where the slice is
+create and pass a **PyArray** as in **argIn4()**, where the slice is
 successful. Similarly, a Java **Map** must come in as a **PyDictionary** in
 order to be treated as a Python dictionary.
 
       }
     }
 
-
 For Python support, you'll usually only need to import the classes in
 **org.python.core**. Everything else in the above example is fairly
 straightforward, as **PythonToJavaClass** appears, from the Java side, to be
-just another Java class. **dumpClassInfo( )** uses reflection to verify that the
+just another Java class. **dumpClassInfo()** uses reflection to verify that the
 method signatures specified in **PythonToJavaClass.py** have come through
 properly.
 
     **PythonInterpreter** command that redirects the output to a Java stream.
 
 #.  Modify **GreenHouseLanguage.py** to add a master controller class (instead
-    of the static array inside **Event**) and provide a **run( )** method for
-    each of the subclasses. Each **run( )** should create and use an object from
+    of the static array inside **Event**) and provide a **run()** method for
+    each of the subclasses. Each **run()** should create and use an object from
     the standard Java library during its execution. Modify
     **GreenHouseController.java** to use this new class.
 
 </li>
 <li class="toctree-l2"><a class="reference external" href="Jython.html#scripting">Scripting</a></li>
 <li class="toctree-l2"><a class="reference external" href="Jython.html#creating-a-language">Creating a Language</a></li>
+<li class="toctree-l2"><a class="reference external" href="Jython.html#controlling-java-from-jython">Controlling Java from Jython</a><ul>
+<li class="toctree-l3"><a class="reference external" href="Jython.html#inner-classes">Inner Classes</a></li>
+</ul>
+</li>
 <li class="toctree-l2"><a class="reference external" href="Jython.html#controlling-the-interpreter">Controlling the Interpreter</a><ul>
 <li class="toctree-l3"><a class="reference external" href="Jython.html#putting-data-in">Putting Data In</a></li>
 <li class="toctree-l3"><a class="reference external" href="Jython.html#getting-data-out">Getting Data Out</a></li>
 <li class="toctree-l3"><a class="reference external" href="Jython.html#multiple-interpreters">Multiple Interpreters</a></li>
 </ul>
 </li>
-<li class="toctree-l2"><a class="reference external" href="Jython.html#controlling-java-from-jython">Controlling Java from Jython</a><ul>
-<li class="toctree-l3"><a class="reference external" href="Jython.html#inner-classes">Inner Classes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference external" href="Jython.html#using-java-libraries">Using Java libraries</a><ul>
-<li class="toctree-l3"><a class="reference external" href="Jython.html#inheriting-from-java-library-classes">Inheriting from Java library Classes</a></li>
-</ul>
-</li>
 <li class="toctree-l2"><a class="reference external" href="Jython.html#creating-java-classes-with-jython">Creating Java classes with Jython</a><ul>
 <li class="toctree-l3"><a class="reference external" href="Jython.html#building-java-classes-from-python">Building Java Classes from Python</a></li>
 </ul>

html/searchindex.js

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