<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Hackflow]]></title>
  <link href="http://suor.github.io/atom.xml" rel="self"/>
  <link href="http://suor.github.io/"/>
  <updated>2023-05-18T18:46:31+07:00</updated>
  <id>http://suor.github.io/</id>
  <author>
    <name><![CDATA[Alexander Schepanovski]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Ban 1+N in Django]]></title>
    <link href="http://suor.github.io/blog/2023/03/26/ban-1-plus-n-in-django/"/>
    <updated>2023-03-26T15:00:00+07:00</updated>
    <id>http://suor.github.io/blog/2023/03/26/ban-1-plus-n-in-django</id>
    <content type="html"><![CDATA[<p>I always thought of 1+N as a thing that you just keep in your head, catch on code reviews or via performance regressions. This worked well for a long time, however, the less control we have over our SQL queries the more likely it will sneak through those guards.</p>

<!--more-->


<h2>A small history dive</h2>

<p>This used to be very visible and meant almost &ldquo;do not perform SQL queries in a cycle&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">books</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s">&quot;SELECT id, title, author_id FROM books&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>  <span class="c"># 1</span>
</span><span class='line'><span class="k">for</span> <span class="nb">id</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">author_id</span> <span class="ow">in</span> <span class="n">books</span><span class="p">:</span>
</span><span class='line'>    <span class="n">c</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s">&quot;SELECT full_name FROM authors WHERE id=?&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">author_id</span><span class="p">])</span>  <span class="c"># +N</span>
</span></code></pre></td></tr></table></div></figure>


<p>With ORM and lazy loading this became a little bit less obvious:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">books</span> <span class="o">=</span> <span class="n">Book</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>  <span class="c"># 1</span>
</span><span class='line'><span class="k">for</span> <span class="n">book</span> <span class="ow">in</span> <span class="n">books</span><span class="p">:</span>
</span><span class='line'>    <span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s">&quot;Book title: {book.title}, author: {book.author.full_name}&quot;</span><span class="p">)</span>  <span class="c"># +N</span>
</span></code></pre></td></tr></table></div></figure>


<p>With something so innocent as an attribute access making an SQL query, it&rsquo;s much easier to miss it. Especially when this code spreads out, the ORM objects are passed to templates, which also have loops and sure they can do attribute access.</p>

<p>As project grows, as its database schema becomes more complicated, as your team grows too, this keeps adding up. And magic also adds up. One particular mention should be a GraphQL library, which resolves onto ORM automatically.</p>

<h2>Back to the present</h2>

<p>I tumbled on a couple of 1+Ns while reading a project code for an unrelated reason and it got me thinking &ndash; do I ever want Django to do that lazy loading stuff? And the answer was never. This was a misfeature for me, the need for such thing is quite circumstantial, usually when you load a list of things you need the same data about all of them, so it doesn&rsquo;t make sense to lazy load extra data for each object separately. Either eager load or batch lazy load, the latter Django does not do.</p>

<p>So, anyway, if I don&rsquo;t need this than I might as well prohibit it, which turned out to be quite easy to do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.db.models.query_utils</span> <span class="kn">import</span> <span class="n">DeferredAttribute</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">_DeferredAttribute_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">instance</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span>
</span><span class='line'>    <span class="n">data</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">__dict__</span>
</span><span class='line'>    <span class="n">field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">data</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Raise an exception to prevent an SQL query</span>
</span><span class='line'>    <span class="n">attr</span> <span class="o">=</span> <span class="n">f</span><span class="s">&quot;{instance.__class__.__name__}.{field_name}&quot;</span>
</span><span class='line'>    <span class="n">message</span> <span class="o">=</span> <span class="n">f</span><span class="s">&quot;Lazy fetching of {attr} may cause 1+N issue&quot;</span>
</span><span class='line'>    <span class="k">raise</span> <span class="ne">LookupError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">DeferredAttribute</span><span class="o">.</span><span class="n">__get__</span> <span class="o">=</span> <span class="n">_DeferredAttribute_get</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way 1+N will blow up instead. Great, we&rsquo;ll catch it during tests. The thing is, however, if 1+Ns were passing our defences before they will probably continue now and this will explode in production. With this in mind, a flood guard and some explanations it transforms into:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">logging</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.db.models.query_utils</span> <span class="kn">import</span> <span class="n">DeferredAttribute</span>
</span><span class='line'>
</span><span class='line'><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
</span><span class='line'><span class="n">attrs_seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">_DeferredAttribute_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
</span><span class='line'>    <span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>  <span class="c"># monkeys go early, settings might not be available yet</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">instance</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span>
</span><span class='line'>    <span class="n">data</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">__dict__</span>
</span><span class='line'>    <span class="n">field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Normally this accessor won&#39;t be called if field_name is in __dict__,</span>
</span><span class='line'>    <span class="c"># we need this part so that DeferredAttribute descendants with __set__ play nice.</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">data</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># If it&#39;s not there already then prevent an SQL query or at least notify we are doing smth bad</span>
</span><span class='line'>    <span class="n">attr</span> <span class="o">=</span> <span class="n">f</span><span class="s">&quot;{instance.__class__.__name__}.{field_name}&quot;</span>
</span><span class='line'>    <span class="c"># Only trigger this check once per attr to not flood Sentry with identical messages</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">attr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">attrs_seen</span><span class="p">:</span>
</span><span class='line'>        <span class="n">attrs_seen</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
</span><span class='line'>        <span class="n">message</span> <span class="o">=</span> <span class="n">f</span><span class="s">&quot;Lazy fetching of {attr} may cause 1+N issue&quot;</span>
</span><span class='line'>        <span class="c"># We stop in DEBUG mode and if inside tests but let production to proceed.</span>
</span><span class='line'>        <span class="c"># Using LookupError instead of AttributeError here to prevent higher level &quot;handling&quot; this.</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span> <span class="ow">or</span> <span class="s">&quot;PYTEST_CURRENT_TEST&quot;</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
</span><span class='line'>            <span class="k">raise</span> <span class="ne">LookupError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Proceed normally</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">_DA_get_original</span><span class="o">.</span><span class="n">original</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">_DA_get_original</span><span class="p">,</span> <span class="n">DeferredAttribute</span><span class="o">.</span><span class="n">__get__</span> <span class="o">=</span> <span class="n">DeferredAttribute</span><span class="o">.</span><span class="n">__get__</span><span class="p">,</span> <span class="n">_DeferredAttribute_get</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which is ready to be used as is. Simply need to put or import it somewhere.</p>

<p><strong>P.S.</strong> A small bonus &ndash; how I tried to <a href="https://gist.github.com/Suor/af424c3501792dba6fcf907506987571">make ChatGPT write this post</a> for me. It was mostly failure :), but refactoring the code sample was done nicely.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Metaprogramming Beyond Decency: Part 2]]></title>
    <link href="http://suor.github.io/blog/2015/04/12/metaprogramming-beyond-decency-part-2/"/>
    <updated>2015-04-12T18:41:00+07:00</updated>
    <id>http://suor.github.io/blog/2015/04/12/metaprogramming-beyond-decency-part-2</id>
    <content type="html"><![CDATA[<p><em>(This is second part of my PiterPy talk adaptation, first part is available <a href="http://suor.github.io/blog/2015/03/29/metaprogramming-beyond-decency/">here</a>)</em></p>

<p>Previously I described various ways AST could be used to alter Python language. Now I will concentrate on translation, and we will translate Python to JavaScript.</p>

<!--more-->


<h2>Translation</h2>

<p>Unlike all Part 1 examples this one started from real need, the one as mundane as form validation:</p>

<p><img src="http://suor.github.io/images/metaprogramming/car-form.png" style="display: block; margin: 0 auto"></p>

<p>Here we have a form with a validation error visible, we typically want this to be shown as soon as possible, so we implement these checks in browser in JavaScript. But we still need to check everything on the server to not let broken data into our database.</p>

<p>Usually we just duplicate logic and this works. Until we get many forms and all of them are like this:</p>

<p><img src="http://suor.github.io/images/metaprogramming/car-form-full.png"></p>

<p>When we arrive to this scale code duplication starts to cause problems duplication always does:
some things are checked only in one place, some things are not updated accordingly and contradict each other. We show weird errors to our users and save broken data to our database.</p>

<p>In ideal world we wish to write every rule just once and then use it in both environments:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Clean raw value</span>
</span><span class='line'><span class="n">clean</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s">r&#39;\s+&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">x</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Validate clean value</span>
</span><span class='line'><span class="n">validate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">1000</span> <span class="o">&lt;=</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">100000000</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we naturally came to translation. We want to write validation in python, translate it to JavaScript and use on front-end automatically.</p>

<h2>The Easy Part</h2>

<p>Let&rsquo;s start from something simple, like translating a plain lambda like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">translate</span><span class="p">(</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will use AST to for translation, so first we need to get it for this lambda. It&rsquo;s hard to get source for lambda to parse it, so we&rsquo;ll use <a href="https://github.com/srossross/Meta">meta</a> library to decompile its bytecode:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">meta.decompiler</span> <span class="kn">import</span> <span class="n">decompile_func</span>
</span><span class='line'>
</span><span class='line'><span class="n">tree</span> <span class="o">=</span> <span class="n">decompile_func</span><span class="p">(</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once we do that we get a tree like this:</p>

<p><img src="http://suor.github.io/images/metaprogramming/rule-tree.dot.svg" style="display: block; margin: 0 auto"></p>

<p>I simplified it to look prettier, but all significant aspects are still here.</p>

<p>The easiest way to render it to a new language is to start from leaves: numbers, variable names and operators mostly look the same in JavaScript. We will employ <code>ast.NodeVisitor</code> to walk the tree:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">Translator</span><span class="p">(</span><span class="n">ast</span><span class="o">.</span><span class="n">NodeVisitor</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visit_Num</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>        <span class="n">node</span><span class="o">.</span><span class="n">js</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">n</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visit_Name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>        <span class="n">node</span><span class="o">.</span><span class="n">js</span> <span class="o">=</span> <span class="s">&#39;null&#39;</span> <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="s">&#39;None&#39;</span> <span class="k">else</span> <span class="n">node</span><span class="o">.</span><span class="n">id</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visit_LtE</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>        <span class="n">node</span><span class="o">.</span><span class="n">js</span> <span class="o">=</span> <span class="s">&#39;&lt;=&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>After using this we come to:</p>

<p><img src="http://suor.github.io/images/metaprogramming/translation-1.dot.svg" style="display: block; margin: 0 auto"></p>

<p>When leaf nodes are done we can compile code for ones depending on them:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">visit_Compare</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Visit sub-nodes</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">generic_visit</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># Concatenate sub-node parts,</span>
</span><span class='line'>    <span class="c"># use parentheses to not worry about operator precedence</span>
</span><span class='line'>    <span class="n">node</span><span class="o">.</span><span class="n">js</span> <span class="o">=</span> <span class="s">&#39;(</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">js</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">js</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">js</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And we&rsquo;ve got to:</p>

<p><img src="http://suor.github.io/images/metaprogramming/translation-2.dot.svg" style="display: block; margin: 0 auto"></p>

<p>We can continue going up the tree and finally get:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">translate</span><span class="p">(</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">)</span>
</span><span class='line'><span class="n">function</span> <span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">(</span><span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">)}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yay! We did it. But&hellip;</p>

<h2>Complications</h2>

<p>What about translating code like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">10</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is no chained comparisons in JavaScript, the best we can do is translating this to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="nx">x</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">x</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is also no <code>not in</code> operator in JavaScript, combining all that <code>Compare</code> translation complicates to (not necessary to read and understand all this, just appreciate the complication):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">visit_Compare</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">generic_visit</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">ops</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">ops</span>
</span><span class='line'>    <span class="n">operands</span> <span class="o">=</span> <span class="p">[</span><span class="n">node</span><span class="o">.</span><span class="n">left</span><span class="p">]</span> <span class="o">+</span> <span class="n">node</span><span class="o">.</span><span class="n">comparators</span>
</span><span class='line'>    <span class="n">pairs</span> <span class="o">=</span> <span class="n">pairwise</span><span class="p">(</span><span class="n">operands</span><span class="p">)</span>  <span class="c"># adjacent pairs of operands</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">node</span><span class="o">.</span><span class="n">js</span> <span class="o">=</span> <span class="s">&#39; &amp;&amp; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">(</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">)&#39;</span> <span class="o">%</span> \
</span><span class='line'>        <span class="p">(</span><span class="s">&#39;!&#39;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">ast</span><span class="o">.</span><span class="n">NotIn</span><span class="p">)</span> <span class="k">else</span> <span class="s">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">l</span><span class="o">.</span><span class="n">js</span><span class="p">,</span> <span class="n">op</span><span class="o">.</span><span class="n">js</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">js</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">op</span><span class="p">,</span> <span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">ops</span><span class="p">,</span> <span class="n">pairs</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another complication is keyword arguments and star arguments. We can deal with them by complecting our code even more or by refusing to handle this case at all:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">visit_Call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>    <span class="k">assert</span> <span class="n">node</span><span class="o">.</span><span class="n">kwargs</span> <span class="ow">is</span> <span class="bp">None</span> \
</span><span class='line'>        <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">starargs</span> <span class="ow">is</span> <span class="bp">None</span>
</span><span class='line'>    <span class="c"># ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we are translating only subset of Python, but this should be okay since translation is not our goal, it&rsquo;s code deduplication for validation rules. So as long as translator works for this particular use case we are fine.</p>

<h2>Closures</h2>

<p>We are still not done yet. We probably don&rsquo;t want to write same validation rules over and over,
so we will end with code like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">up_to</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">limit</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="n">limit</span>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">translate</span><span class="p">(</span><span class="n">up_to</span><span class="p">(</span><span class="mi">50</span><span class="p">))</span>
</span><span class='line'><span class="n">function</span> <span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">(</span><span class="n">v</span> <span class="o">&lt;=</span> <span class="n">limit</span><span class="p">)}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&rsquo;s easy to see that <code>limit</code> in JavaScript code refers to non-existing variable. To fix that we need to introspect values enclosed within a function, thankfully Python introspection has our back:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">u50</span> <span class="o">=</span> <span class="n">up_to</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">u50</span><span class="o">.</span><span class="n">__closure__</span>
</span><span class='line'><span class="p">(</span><span class="o">&lt;</span><span class="n">cell</span> <span class="n">at</span> <span class="o">...</span><span class="p">:</span> <span class="nb">int</span> <span class="nb">object</span> <span class="o">...&gt;</span><span class="p">,)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here the closure is a tuple containing single cell with an int object in it. Makes sense since we are enclosing <code>50</code>. It&rsquo;s fairly easy to get cell contents:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="p">[</span><span class="n">cell</span><span class="o">.</span><span class="n">cell_contents</span>
</span><span class='line'>      <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">u50</span><span class="o">.</span><span class="n">__closure__</span><span class="p">]</span>
</span><span class='line'><span class="p">[</span><span class="mi">50</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&rsquo;s also easy to introspect free variables refering to enclosed values:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">u50</span><span class="o">.</span><span class="n">__code__</span><span class="o">.</span><span class="n">co_freevars</span>
</span><span class='line'><span class="p">(</span><span class="s">&#39;limit&#39;</span><span class="p">,)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This <code>co_freevars</code> always have the same length and order as cells in closure, so we can pair them up and translate the whole thing to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">limit</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">v</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="nx">v</span> <span class="o">&lt;=</span> <span class="nx">limit</span><span class="p">)}</span>
</span><span class='line'><span class="p">}())</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we&rsquo;ve got a closure. This highlights how we are not really translating functions, but closures,
which are functions plus context.</p>

<h2>More Closures</h2>

<p>Unfortunately <code>func.__closure__</code> doesn&rsquo;t capture everything, any global names and built-ins are still uncovered. Let&rsquo;s translate this one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">len50</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">50</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can access function globals and built-ins namespaces with:</p>

<div class="break-code">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">len50</span><span class="o">.</span><span class="n">__globals__</span>
</span><span class='line'><span class="p">{</span><span class="s">&#39;len50&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">function</span> <span class="o">&lt;</span><span class="k">lambda</span><span class="o">&gt;</span> <span class="n">at</span> <span class="mh">0x7f705a92a848</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;__builtins__&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">module</span> <span class="s">&#39;__builtin__&#39;</span> <span class="p">(</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;dis&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">module</span> <span class="s">&#39;dis&#39;</span> <span class="kn">from</span> <span class="s">&#39;/usr/lib/python2.7/dis.pyc&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;translate&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">function</span> <span class="n">js</span><span class="o">.</span><span class="n">translate</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;s&#39;</span><span class="p">:</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&lt;section&gt;</span><span class="se">\n</span><span class="s">&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;&gt;&gt;&gt; [cell.cell_contents</span><span class="se">\n</span><span class="s">...&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">__builtin__</span><span class="o">.</span><span class="n">__dict__</span>
</span><span class='line'><span class="p">{</span><span class="s">&#39;bytearray&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="nb">type</span> <span class="s">&#39;bytearray&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;IndexError&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="nb">type</span> <span class="s">&#39;exceptions.IndexError&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;all&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">function</span> <span class="nb">all</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;vars&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">function</span> <span class="nb">vars</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;SyntaxError&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="nb">type</span> <span class="s">&#39;exceptions.SyntaxError&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;isinstance&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">function</span> <span class="nb">isinstance</span><span class="o">&gt;</span><span class="p">,</span> <span class="s">&#39;copyright&#39;</span><span class="p">:</span> <span class="n">Copyright</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="mi">2001</span><span class="o">-</span><span class="mi">2014</span> <span class="n">Python</span> <span class="n">Software</span> <span class="n">Foundatio</span><span class="o">...</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>So we only need to detect global names used by a function. We could have walked the AST, but then we would need to separate local and enclosed non-local names from global ones. The easier way is to introspect bytecode, which looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">len50</span><span class="o">.</span><span class="n">__code__</span><span class="o">.</span><span class="n">co_code</span>
</span><span class='line'><span class="s">&#39;t</span><span class="se">\x00\x00</span><span class="s">|</span><span class="se">\x00\x00\x83\x01\x00</span><span class="s">d</span><span class="se">\x01\x00</span><span class="s">k</span><span class="se">\x01\x00</span><span class="s">S&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just a binary string, not that pretty. But python standard library provides us <a href="https://docs.python.org/2/library/dis.html">dis</a> module to handle that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">dis</span><span class="o">.</span><span class="n">dis</span><span class="p">(</span><span class="n">len50</span><span class="p">)</span>
</span><span class='line'><span class="mi">1</span>       <span class="mi">0</span> <span class="n">LOAD_GLOBAL</span>         <span class="mi">0</span> <span class="p">(</span><span class="nb">len</span><span class="p">)</span>
</span><span class='line'>        <span class="mi">3</span> <span class="n">LOAD_FAST</span>           <span class="mi">0</span> <span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span><span class='line'>        <span class="mi">6</span> <span class="n">CALL_FUNCTION</span>       <span class="mi">1</span>
</span><span class='line'>        <span class="mi">9</span> <span class="n">LOAD_CONST</span>          <span class="mi">1</span> <span class="p">(</span><span class="mi">50</span><span class="p">)</span>
</span><span class='line'>       <span class="mi">12</span> <span class="n">COMPARE_OP</span>          <span class="mi">1</span> <span class="p">(</span><span class="o">&lt;=</span><span class="p">)</span>
</span><span class='line'>       <span class="mi">15</span> <span class="n">RETURN_VALUE</span>
</span></code></pre></td></tr></table></div></figure>


<p>The thing to see here is <code>LOAD_GLOBAL</code> instruction, it corresponds to global variable use. <code>dis</code> module only prints bytecode nicely, but doesn&rsquo;t let us really in. So we go for another asset &mdash; <a href="https://pypi.python.org/pypi/byteplay">byteplay</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">byteplay</span> <span class="kn">import</span> <span class="n">Code</span><span class="p">,</span> <span class="n">LOAD_GLOBAL</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Wrap code into byteplay object</span>
</span><span class='line'><span class="n">code</span> <span class="o">=</span> <span class="n">Code</span><span class="o">.</span><span class="n">from_code</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">__code__</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Iterate over instructions and collect names</span>
</span><span class='line'><span class="n">names</span> <span class="o">=</span> <span class="p">{</span><span class="n">param</span> <span class="k">for</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">code</span><span class="o">.</span><span class="n">code</span>
</span><span class='line'>               <span class="k">if</span> <span class="n">cmd</span> <span class="o">==</span> <span class="n">LOAD_GLOBAL</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we collected all refered global names, we can translate them unless they are implemented in C.
To handle that we can supply a dict like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">BUILTINS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>    <span class="nb">len</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">length</span><span class="p">,</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>With code which doesn&rsquo;t make sense in Python. However, it will make sense after translation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">translate</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">50</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="n">function</span> <span class="p">(){</span>
</span><span class='line'>    <span class="n">var</span> <span class="nb">len</span> <span class="o">=</span> <span class="n">function</span> <span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">length</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">function</span> <span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">50</span><span class="p">)}</span>
</span><span class='line'><span class="p">}())</span>
</span></code></pre></td></tr></table></div></figure>


<p>Actually we could have used strings in <code>BUILTINS</code> dict, but with lambdas we can refer to other things in our implementations:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">BUILTINS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>    <span class="n">identity</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">,</span>
</span><span class='line'>    <span class="nb">all</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">seq</span><span class="p">:</span> <span class="n">seq</span><span class="o">.</span><span class="n">every</span><span class="p">(</span><span class="n">identity</span><span class="p">),</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which enables us to make things like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span> <span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">all</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">identity</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">x</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">seq</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">seq</span><span class="p">.</span><span class="nx">every</span><span class="p">(</span><span class="nx">identity</span><span class="p">)}</span>
</span><span class='line'>        <span class="p">}()),</span>
</span><span class='line'>        <span class="nx">len</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">s</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="nx">s</span><span class="p">.</span><span class="nx">length</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">xs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">((</span><span class="nx">len</span><span class="p">(</span><span class="nx">xs</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nx">all</span><span class="p">(</span><span class="nx">xs</span><span class="p">))}</span>
</span><span class='line'><span class="p">}())</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here <code>all()</code> is defined as a nested closure. Also the whole thing starts to look complex.
Fortunately we don&rsquo;t need to write this, we don&rsquo;t even need to read this, we only deal with
python lambdas. And that one is just a single line for the mess above:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">lambda</span> <span class="n">xs</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Meeting Halfway</h2>

<p>We&rsquo;ve already come a long way, however, some things still won&rsquo;t work:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Does&#39;t work, it&#39;s s.trim() in JavaScript</span>
</span><span class='line'><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>To fix this we will need to write shims for all python types and convert everything before passing to our function. This sounds like a lot of work, so went another way &mdash; just don&rsquo;t write like that, write this way instead:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Does work if &quot;string&quot; is in BUILTINS</span>
</span><span class='line'><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Look, system does many things to make everything work, now we can come along and finally meet halfway. This approach worked wonderfully for us, we managed to get practical solution with:</p>

<ul>
<li>no runtime,</li>
<li>no shims,</li>
<li>only 300 lines of code.</li>
</ul>


<p>Compare this to full-blown python to js translator. Anyway let&rsquo;s see what it have brought to us.</p>

<h2>Demos</h2>

<p>Here is how validation looks. It updates as we type and wholly executed in the browser:</p>

<p><img src="http://suor.github.io/images/metaprogramming/demo-validation.gif" style="display: block; margin: 0 auto"></p>

<p>And we don&rsquo;t write any JavaScript to achieve that. We write this instead:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PriceField</span><span class="p">(</span><span class="n">FlexField</span><span class="p">):</span>
</span><span class='line'>    <span class="n">clean</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s">&#39;\s+&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
</span><span class='line'>    <span class="n">rules</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">[</span><span class="k">lambda</span> <span class="n">t</span><span class="p">:</span> <span class="n">re_test</span><span class="p">(</span><span class="s">r&#39;^[\s\d]*$&#39;</span><span class="p">,</span> <span class="n">t</span><span class="p">),</span> <span class="s">&#39;Enter a number&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="mi">100000000</span><span class="p">,</span> <span class="s">&#39;Specify adequate price&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span> <span class="o">&gt;=</span> <span class="mi">1000</span><span class="p">,</span> <span class="s">&#39;Specify price in rubles, ...&#39;</span><span class="p">],</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This works both in browser and server-side so we don&rsquo;t need to duplicate logic or messages. Also having lots of similar fields we can reuse everything: fields, predicates, cleanup functions, rules, which are just lambdas plus text messages. So it really looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PriceField</span><span class="p">(</span><span class="n">FlexField</span><span class="p">):</span>
</span><span class='line'>    <span class="n">clean</span> <span class="o">=</span> <span class="n">clean</span><span class="o">.</span><span class="n">posint</span>
</span><span class='line'>    <span class="n">rules</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="n">rule</span><span class="o">.</span><span class="n">posint</span><span class="p">,</span>
</span><span class='line'>        <span class="p">[</span><span class="n">test</span><span class="o">.</span><span class="n">lt</span><span class="p">(</span><span class="mi">100000000</span><span class="p">),</span> <span class="s">&#39;Specify adequate price&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="n">test</span><span class="o">.</span><span class="n">ge</span><span class="p">(</span><span class="mi">1000</span><span class="p">),</span> <span class="s">&#39;Specify price in rubles, ...&#39;</span><span class="p">],</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can also employ inheritance:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PriceField</span><span class="p">(</span><span class="n">PosIntegerField</span><span class="p">):</span>
</span><span class='line'>    <span class="n">rules</span> <span class="o">=</span> <span class="o">...</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Computed Properties</h3>

<p>We really got more from this system than just validation. And first thing to show is computed properties. These are visibility, labels, choices and more. I&rsquo;ll demo it with another tiny screencast:</p>

<p><img src="http://suor.github.io/images/metaprogramming/demo-visibility.gif" style="display: block; margin: 0 auto"></p>

<p>Here we can see several aspects &mdash; when user selects &ldquo;exchange to a car&rdquo; a new drop-down appears,
and when a label changes depending on who pays extra. Here is how it looks in code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">ExtraPaymentField</span><span class="p">(</span><span class="n">FlexField</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Relabel depending on who pays extra</span>
</span><span class='line'>    <span class="n">label</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="p">(</span><span class="s">&#39;Max&#39;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exchange_terms</span> <span class="o">=</span> <span class="n">MY_EXTRA</span> <span class="k">else</span> <span class="s">&#39;Min&#39;</span><span class="p">)</span> \
</span><span class='line'>                         <span class="o">+</span> <span class="s">&#39; extra payment&#39;</span>
</span><span class='line'>    <span class="c"># Show if there is an extra payment involved</span>
</span><span class='line'>    <span class="n">visible</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">exchange_terms</span> <span class="o">!=</span> <span class="n">NO_EXTRA</span>
</span></code></pre></td></tr></table></div></figure>


<p>Additional benefit we get here is that we can compute visibility server-side and do 2 things: first, render a form in an appropriate state from the start (less flickering in the browser) and, second, discard any input we got from invisible fields automatically. Another example of additional benefit is calculated choices, able to get them on back-end we can check if value is one of them.</p>

<p>Other thing to note is that now we have dependencies, e.g. label text and visibility depends on <code>exchange_terms</code> field value. We could have added some tricky introspection, but we instead required programmers to specify dependencies explicitly:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">ExtraPaymentField</span><span class="p">(</span><span class="n">FlexField</span><span class="p">):</span>
</span><span class='line'>    <span class="nd">@depends</span><span class="p">(</span><span class="s">&#39;exchange_terms&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visible</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">exchange_terms</span> <span class="o">!=</span> <span class="n">NO_EXTRA</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is in line with our meeting halfway principle and it worked this time too.</p>

<h3>Passing Data</h3>

<p>The last demo for today will show how easily we can pass data to client. Here I show how field values could be automatically selected:</p>

<p><img src="http://suor.github.io/images/metaprogramming/demo-autoselect.gif" style="display: block; margin: 0 auto"></p>

<p>To look through car models we need to pass their list to browser and we can do this simply by enclosing data structure with a function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">models</span> <span class="o">=</span> <span class="n">CarModel</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s">&#39;pk&#39;</span><span class="p">,</span> <span class="s">&#39;title&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">value</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="n">first</span><span class="p">(</span><span class="n">pk</span> <span class="k">for</span> <span class="n">pk</span><span class="p">,</span> <span class="n">title</span> <span class="ow">in</span> <span class="n">models</span>
</span><span class='line'>                              <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lookup</span> <span class="ow">in</span> <span class="n">title</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This lambda uses <code>models</code> so they are translated to JavaScripts array of arrays and passed along with function. This is very handy when, for example, creating chained selects and under many other circumstances.</p>

<h2>The Bigger System</h2>

<p>You probably already noticed that there is a bigger system besides translator here. These are all its parts:</p>

<ul>
<li>declarative descriptions of fields, models, forms, filters, listings and detail pages,</li>
<li>translation of clean, validate and property compute functions,</li>
<li>transparent data forwarding.</li>
</ul>


<p>There is the thing with tools that when you introduce some new very useful one you get a whole lot of new possibilities, you can make much faster something that took ages previously or you can even do things, which were impossible before.</p>

<p>This also works for developer tools. Introduction of this system had led to a population boom &mdash; we&rsquo;ve got from 7 forms to 51, and you can double that number &lsquo;cause we also autogenerate filtering form for each of them. We also got to 500+ database tables. All of this without loosing our sanity or growing our code base to some insane LOC number.</p>

<h2>Decency</h2>

<p>In python world we have this stigma on metaprogramming. Like it&rsquo;s dirty and should not be used in any serious setting. It&rsquo;s true that this is a complex technique that brings its costs. But as any other consideration this has its limits.</p>

<p>By promoting reasonable considerations to emotional and even kind of religious level we loose an ability to judge it mindfully. We dismiss something even before considering it seriously. And doing so we miss great solutions.</p>

<p>This worked for us. What will do for you?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Metaprogramming Beyond Decency: Part 1]]></title>
    <link href="http://suor.github.io/blog/2015/03/29/metaprogramming-beyond-decency/"/>
    <updated>2015-03-29T20:08:00+07:00</updated>
    <id>http://suor.github.io/blog/2015/03/29/metaprogramming-beyond-decency</id>
    <content type="html"><![CDATA[<p><em>(This an adaptation of a talk I gave at PiterPy. <a href="http://suor.github.io/slides/metaprogramming/">Slides</a> and <a href="http://www.youtube.com/watch?v=Q8qxeFGNT9A">video</a> are available in russian)</em></p>

<p>Python gives us deep introspecting and metaprogramming capabilities including bytecode and AST support in the standard library. This facilitates unobvious ways to write code that writes code or otherwise alters its behavior. I will show several different examples of how it could be used for
fun and profit.</p>

<!--more-->


<h2>Warming up</h2>

<p>Look at this code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="nb">map</span><span class="p">(</span><span class="n">_</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
</span><span class='line'><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>It maps a list through <code>_ + 1</code> and gets a new list with each element incremented.
This makes sense mnemonically, but can this code actually work in python?</p>

<p>And sure it can. In fact this is rather simple trick with operator overloading:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">Whatever</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
</span><span class='line'>
</span><span class='line'><span class="n">_</span> <span class="o">=</span> <span class="n">Whatever</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we create a class that produces lambda upon addition and then creates its instance named <code>_</code>.
Just using common interface in an unusual way. We can even go all loose and make something like this to work:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Sort guys by height descending</span>
</span><span class='line'><span class="n">sort</span><span class="p">(</span><span class="n">guys</span><span class="p">,</span> <span class="n">key</span><span class="o">=-</span><span class="n">_</span><span class="o">.</span><span class="n">height</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Reduce my multiplication</span>
</span><span class='line'><span class="n">factorial</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">reduce</span><span class="p">(</span><span class="n">_</span> <span class="o">*</span> <span class="n">_</span><span class="p">,</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Returning lambda, obviously, won&rsquo;t work anymore. However, we can return a callable object,
which also returns callables as operations results. We are also intercepting attribute access here,
shouldn&rsquo;t surprise you after everything you&rsquo;ve seen.</p>

<p>Honestly, I was too shy to use this in production. And you usually need only one or two lambdas in a file anyway, too few to bring an import, a dependency and all the complications.
But suppose you are writing <a href="https://github.com/Suor/funcy/blob/master/tests/test_funcs.py">tests for functional support library</a>,
then you&rsquo;ll need to create lots of small functions to pass them to your ones.
A library like this would be useful in that setting.</p>

<p>Anyway, if you still think this idea is too weird then you should know that there are at least 3 libraries implementing it:</p>

<ul>
<li><a href="https://github.com/Suor/whatever">whatever</a></li>
<li><a href="https://pypi.python.org/pypi/placeholder">placeholder</a></li>
<li><a href="https://github.com/kachayev/fn.py">fn.py</a></li>
</ul>


<p>But let&rsquo;s move to something more interesting.</p>

<h2>Pattern Matching</h2>

<p>Now look at this and think if it is also feasible in python.
This is supposed to recursively calculate a product of all the list elements:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">product</span><span class="p">():</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">[]:</span> <span class="mi">1</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">+</span> <span class="n">xs</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="n">product</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you familiar with pattern matching then the code makes sense:</p>

<ul>
<li>product is 1 for empty list,</li>
<li>product is (first element) times (product of the rest of the list) otherwise.</li>
</ul>


<p>On the other hand, python doesn&rsquo;t work this way. <code>x</code> and <code>xs</code> are never defined and <code>product()</code> has no arguments. And yes, this really doesn&rsquo;t work. This, however, does:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">patterns</span> <span class="kn">import</span> <span class="n">patterns</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@patterns</span>
</span><span class='line'><span class="k">def</span> <span class="nf">product</span><span class="p">():</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">[]:</span> <span class="mi">1</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">+</span> <span class="n">xs</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="n">product</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>@patterns</code> here rewrites function into something we meant. It can&rsquo;t obviously be implemented as ordinary decorator, since calling original function will crash. So <code>@patterns</code> reads function code instead, parses it into abstract syntax tree, transforms that to a meaningful one and then compiles back:</p>

<blockquote><p>Code  →  AST  →  New AST  →  New Code</p></blockquote>


<!-- TODO: make it pretty -->


<p>And after transformation we get something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">product</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="p">[]:</span>
</span><span class='line'>        <span class="k">return</span> <span class="mi">1</span>
</span><span class='line'>    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
</span><span class='line'>        <span class="n">x</span><span class="p">,</span> <span class="n">xs</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">value</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">product</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which looks like normal python code, it is also much more verbose.
That&rsquo;s why we got into this whole pattern matching thing in the first place.</p>

<p>And again it was too awkward to use all this magic in production code,
but I used code inspired by that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Use simple pattern matching to construct form field widget</span>
</span><span class='line'><span class="n">TYPE_TO_WIDGET</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>    <span class="p">[</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">choices</span><span class="p">,</span>           <span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">Select</span><span class="p">(</span><span class="n">choices</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">choices</span><span class="p">)],</span>
</span><span class='line'>    <span class="p">[</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s">&#39;int&#39;</span><span class="p">,</span>     <span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">TextInput</span><span class="p">(</span><span class="nb">coerce</span><span class="o">=</span><span class="nb">int</span><span class="p">)],</span>
</span><span class='line'>    <span class="p">[</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s">&#39;string&#39;</span><span class="p">,</span>  <span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">TextInput</span><span class="p">()],</span>
</span><span class='line'>    <span class="p">[</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s">&#39;text&#39;</span><span class="p">,</span>    <span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">Textarea</span><span class="p">()],</span>
</span><span class='line'>    <span class="p">[</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s">&#39;boolean&#39;</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">Checkbox</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">label</span><span class="p">)],</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'><span class="k">return</span> <span class="n">first</span><span class="p">(</span><span class="n">do</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="k">for</span> <span class="n">cond</span><span class="p">,</span> <span class="n">do</span> <span class="ow">in</span> <span class="n">TYPE_TO_WIDGET</span> <span class="k">if</span> <span class="n">cond</span><span class="p">(</span><span class="n">field</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This actually could be useful for many things: recursive functions, chatbots, binary protocol implementations and other occasions when you resolve to long if-elses or switch-cases.
The general idea, however, comes beyond pattern matching.</p>

<h2>AST Applications</h2>

<p>This technique &mdash; abstract syntax tree transformation &mdash; is much more broadly useful.
And the main reason is that trees capture language structure. Another trees virtue is that they are data structures, which are much more hackable than code strings.</p>

<p>Anyway, these are some things they facilitate:</p>

<p><strong>Language extensions.</strong> With pattern matching being only one of them. Other examples are optional (or not) static typing, macros, &hellip; It is only limited by your imagination and tree transformation skills. You obviously need to stay within syntax though, unless you go for separate parser and AST, but this is a separate topic.</p>

<p><strong>Optimizations</strong>. This is less obvious but we can inline calls, precalculate constant expressions, even make tail call optimization.</p>

<p><strong>Code analysis</strong>. It&rsquo;s much easier to analyze tree than just code string &lsquo;cause it captures some of semantics of a language. We can implement some linters or editor plugins with the help of AST.
Generally you won&rsquo;t need to transform a tree for analysis, but imagine some linter suggesting code changes specific to your particular fragment not general advice. That would be cool.</p>

<p><strong>Translation</strong>. To JavaScript to run things in browser, to SQL to automatically generate queries
or stored procedures, to Python 3 after all.</p>

<p>These are various ways it flows:</p>

<blockquote><p>Code  →  AST  →  New AST  →  New Code<br/>Code  →  AST  →  JavaScript<br/>Bytecode  →  AST  →  SQL</p></blockquote>


<!-- TODO: make a flowchart? -->


<p>Looks like we need to dig a bit more into AST.</p>

<h2>AST</h2>

<p>First we need a way to get a tree. The easiest way is to first get source and then parse it. Two standard modules will help us with that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">inspect</span><span class="o">,</span> <span class="nn">ast</span>
</span><span class='line'>
</span><span class='line'><span class="n">source</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getsource</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span class='line'><span class="n">tree</span> <span class="o">=</span> <span class="n">ast</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sometimes you can&rsquo;t get function source, most common example &mdash; <code>inspect.getsource()</code> doesn&rsquo;t work with lambdas. Then you can still get to AST by decompiling bytecode:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">meta.decompiler</span> <span class="kn">import</span> <span class="n">decompile_func</span>
</span><span class='line'>
</span><span class='line'><span class="n">tree</span> <span class="o">=</span> <span class="n">decompile_func</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are using third party module <a href="https://github.com/srossross/Meta">meta</a> here, and despite saying that we decompile function it really does inspect and decompile its bytecode. Anyway, we&rsquo;ve got our AST, let&rsquo;s look at it:</p>

<p><img src="http://suor.github.io/slides/metaprogramming/ast-example.dot.svg" style="width: 100%"></p>

<p>This is quite a hairy tree for something as simple as <code>lambda x: x + 1</code>. But if we look at it a bit
more closer we can recognize all the corresponding parts. Left branch is arguments, which have single argument named <code>x</code>, but no kwarg, vararg or defaults. Right branch is a return node returning a result of binary operation with an op of addition and operands of a name <code>x</code> and a number <code>1</code>.</p>

<p>That makes sense, this is not however what we see as a result in python REPL:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">tree</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">Lambda</span> <span class="n">at</span> <span class="mh">0x7f7e2359e490</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yeah, it&rsquo;s just a <code>Lambda</code> object. We can look up its attributes to get other nodes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">tree</span><span class="o">.</span><span class="n">body</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">Return</span> <span class="n">at</span> <span class="mh">0x7f3e75f869d0</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is what python AST actually is: a collection of objects stored in the attributes of each other. In addition I need to say that this objects don&rsquo;t really have behaviour, they are just data.
You can find full list of available nodes and their attributes in <a href="https://docs.python.org/2/library/ast.html">ast module</a> documentation.</p>

<p>Inspecting AST this way could be too tiresome, we need some way to get a bigger picture.
The simplest thing we have is <code>ast.dump()</code> utility:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">ast</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span><span class='line'><span class="n">Lambda</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="n">arguments</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">Name</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&#39;x&#39;</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">Param</span><span class="p">())],</span> <span class="n">vararg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">kwarg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
</span><span class='line'><span class="n">defaults</span><span class="o">=</span><span class="p">[]),</span> <span class="n">body</span><span class="o">=</span><span class="n">Return</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">BinOp</span><span class="p">(</span><span class="n">left</span><span class="o">=</span><span class="n">Name</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&#39;x&#39;</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">Load</span><span class="p">()),</span> <span class="n">op</span><span class="o">=</span><span class="n">Add</span><span class="p">(),</span>
</span><span class='line'><span class="n">right</span><span class="o">=</span><span class="n">Num</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the same thing we saw in the picture, it is also useless for any non-trivial case. One more
third-party library, <a href="https://github.com/berkerpeksag/astor">astor</a>, could help us out:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">astor</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span><span class='line'><span class="n">Lambda</span><span class="p">(</span>
</span><span class='line'>    <span class="n">args</span><span class="o">=</span><span class="n">arguments</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">Name</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&#39;x&#39;</span><span class="p">)],</span> <span class="n">vararg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">kwarg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="p">[]),</span>
</span><span class='line'>    <span class="n">body</span><span class="o">=</span><span class="n">Return</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">BinOp</span><span class="p">(</span><span class="n">left</span><span class="o">=</span><span class="n">Name</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">&#39;x&#39;</span><span class="p">),</span> <span class="n">op</span><span class="o">=</span><span class="n">Add</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="n">Num</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same plus indents. It is already useful when you need to look at the AST closer, but for quick print debugging python code would be even better:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">astor</span><span class="o">.</span><span class="n">to_source</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Parentheses are added everywhere to avoid dealing with operator precedence, but otherwise it&rsquo;s the same code we parsed.</p>

<p>And the last thing we usually do to AST &mdash; compile it back and execute:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">code</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">(</span><span class="n">tree</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="s">&#39;exec&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">context</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'><span class="k">exec</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="nb">globals</span><span class="p">(),</span> <span class="n">context</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Functions used here, <code>compile()</code> and <code>exec()</code>, are built-ins. And <code>code</code> is the same object type you can find introspecting <code>func.__code__</code>. By executing in a context we set all the names defined into that dict:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">context</span>
</span><span class='line'><span class="p">{</span><span class="s">&#39;func&#39;</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">function</span> <span class="n">__main__</span><span class="o">.</span><span class="n">func</span><span class="o">&gt;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So if all these were happening in a decorator we can get that function out of the context and substitute original one. Only the meat is left &mdash; walking the tree.</p>

<h2>AST Traversal</h2>

<p>Built-in ast module continues to aid us in this journey. It provides several utilities to ease tree walking and transformation. The lower level ones let us introspect nodes contents and iterate by them:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Iterate fields with values</span>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">ast</span><span class="o">.</span><span class="n">iter_fields</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span><span class='line'><span class="p">[(</span><span class="s">&#39;args&#39;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">arguments</span> <span class="n">at</span> <span class="o">...&gt;</span><span class="p">),</span>
</span><span class='line'> <span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">Return</span> <span class="n">at</span> <span class="o">...&gt;</span><span class="p">)]</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Iterate child nodes</span>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">ast</span><span class="o">.</span><span class="n">iter_child_nodes</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span><span class='line'><span class="p">[</span><span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">arguments</span> <span class="o">...&gt;</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">_ast</span><span class="o">.</span><span class="n">Return</span> <span class="o">...&gt;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Just list available fields</span>
</span><span class='line'><span class="o">&gt;&gt;&gt;</span> <span class="n">tree</span><span class="o">.</span><span class="n">_fields</span>
</span><span class='line'><span class="p">(</span><span class="s">&#39;args&#39;</span><span class="p">,</span> <span class="s">&#39;body&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>First of higher level ones is <code>NodeVisitor</code> &mdash; a base class implementing visitor pattern, the idea is to subclass it and define methods like <code>visit_&lt;NodeClass&gt;()</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">NumberFinder</span><span class="p">(</span><span class="n">ast</span><span class="o">.</span><span class="n">NodeVisitor</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visit_Num</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>        <span class="k">print</span> <span class="s">&quot;Found number literal&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">n</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">find_numbers</span><span class="p">(</span><span class="n">tree</span><span class="p">):</span>
</span><span class='line'>    <span class="n">NumberFinder</span><span class="p">()</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This simple example finds all the number literals in given code. Just an example, but it could be grown into some magic number finding tool and wrapped into linter or code editor plugin.</p>

<p>The second base class ast provides is <code>NodeTransformer</code>. It works almost the same, but you can change a tree by returning new nodes from visit methods:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">ExprOptimizer</span><span class="p">(</span><span class="n">ast</span><span class="o">.</span><span class="n">NodeTransformer</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">visit_BinOp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Call .generic_visit() to transform sub-nodes</span>
</span><span class='line'>        <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_visit</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'>        <span class="c"># If both operands are just numbers then precalculate</span>
</span><span class='line'>        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">left</span><span class="p">)</span> <span class="ow">is</span> <span class="n">Num</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">right</span><span class="p">)</span> <span class="ow">is</span> <span class="n">Num</span><span class="p">:</span>
</span><span class='line'>            <span class="n">op</span> <span class="o">=</span> <span class="n">AST_TO_OP</span><span class="p">[</span><span class="n">node</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">__class__</span><span class="p">]</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">Num</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="n">op</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">n</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">n</span><span class="p">))</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">node</span>
</span><span class='line'>
</span><span class='line'><span class="n">AST_TO_OP</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">Add</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">add</span><span class="p">,</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This one precalculates any expressions on number literals, quite neat for just a bunch of lines.</p>

<p>And last but not least we can use old and good recursive tree walking. This snippet makes python function return last expression in a way Ruby, CoffeScript and Clojure do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">return_last</span><span class="p">(</span><span class="n">tree</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">tree</span><span class="p">,</span> <span class="s">&#39;body&#39;</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span>
</span><span class='line'>    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">Expr</span><span class="p">):</span>
</span><span class='line'>        <span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">Return</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="n">return_last</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note this code is simplified and hence broken, e.g. it will insert <code>return</code> into the end of while loop if there is an expression there.</p>

<h2>Going Forward</h2>

<p>This was an overview of what you can do with AST, and there were lots of things. This is, however, only a preface to the actual story. Next time I will concentrate on translation and will describe it in detail capturing a real use case.</p>

<p><strong>P.S.</strong> Second part is available <a href="http://suor.github.io/blog/2015/04/12/metaprogramming-beyond-decency-part-2/">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Boiling React Down to a Few Lines in jQuery]]></title>
    <link href="http://suor.github.io/blog/2015/03/08/boiling-react-down-to-few-lines-in-jquery/"/>
    <updated>2015-03-08T20:08:00+07:00</updated>
    <id>http://suor.github.io/blog/2015/03/08/boiling-react-down-to-few-lines-in-jquery</id>
    <content type="html"><![CDATA[<p>You probably heard something like how React is awesome &lsquo;cause it makes UI a pure function of application state? But even before you started to get that it was complemented with something like how that works on top of immutability and virtual DOM? And then you get free save, load, undo and something insane called time-travel debugging on top of that. Guess what? None of these are necessary to use core React idea and reap its benefits. And I&rsquo;ll show that in a few lines in jQuery.</p>

<!--more-->




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;colored-counter&quot;</span><span class="nt">&gt;</span>0<span class="nt">&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;color&quot;</span><span class="nt">&gt;&lt;/input&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">&quot;inc&quot;</span><span class="nt">&gt;&lt;/button&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#color&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;keyup&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#colored-counter&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;color&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#inc&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">oldValue</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#colored-counter&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">newValue</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="nb">Number</span><span class="p">(</span><span class="nx">oldValue</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#colored-counter&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">newValue</span><span class="p">);</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Could be written as:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;colored-counter&quot;</span><span class="nt">&gt;</span>0<span class="nt">&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;color&quot;</span><span class="nt">&gt;&lt;/input&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">&quot;inc&quot;</span><span class="nt">&gt;&lt;/button&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">state</span> <span class="o">=</span> <span class="p">{</span><span class="nx">color</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="mi">0</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#colored-counter&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;color&#39;</span><span class="p">,</span> <span class="nx">state</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#colored-counter&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">state</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#color&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;keyup&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">state</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#inc&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">state</span><span class="p">.</span><span class="nx">value</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This demonstrates React idea in its simplest (and a bit bastardized way). We get to this later, now we should answer a reasonable question: how is this better?
Let me draw you a picture. This is how first variant works:</p>

<p><img src="http://suor.github.io/images/boiling-react-down/jquery-small.svg" style="width: 100%" /></p>

<p>And this is how second one does:</p>

<p><img src="http://suor.github.io/images/boiling-react-down/react-small.svg" style="width: 100%" /></p>

<p>Doesn&rsquo;t look that much better, but let us think scale. Over time our UI will get more events and elements, some events will update more than one element, some elements will be updated by more than one event. So we will get this:</p>

<p><img src="http://suor.github.io/images/boiling-react-down/jquery-big.svg" style="width: 100%" /></p>

<p>And even with our bastardized React-like code we get:</p>

<p><img src="http://suor.github.io/images/boiling-react-down/react-big.svg" style="width: 100%" /></p>

<p>In first picture we have <code>N</code> events, <code>M</code> elements and up to <code>O(N*M)</code> links.
In second one we have just <code>N</code> event links and <code>M</code> element links.
Overall we got from potential <code>O(N*M)</code> complexity down to <code>O(N+M)</code>, not bad for a simple trick.</p>

<p>Now it looks like we got something. But what about all those magical powers?
Ah, we almost got them too.</p>

<h2>Magical Powers</h2>

<p>Basically all magical powers mentioned come from an ability to write:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// save</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">cannedState</span> <span class="o">=</span> <span class="nx">deepcopy</span><span class="p">(</span><span class="nx">state</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// load</span>
</span><span class='line'><span class="nx">state</span> <span class="o">=</span> <span class="nx">cannedState</span><span class="p">;</span>
</span><span class='line'><span class="nx">updateUI</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is facilitated by 2 facts:</p>

<ul>
<li>we have a single explicit state,</li>
<li>we can update UI to comply to arbitrary state.</li>
</ul>


<p>That&rsquo;s it. We can write serialized canned state to local storage, send it to server, manage a history of canned states. And this will give us page reload protection, persistence and undo/time-travel respectively.</p>

<p>Confused? Let&rsquo;s write some code. That&rsquo;s how we protect from accidental page reload:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Save latest state to local storage</span>
</span><span class='line'>    <span class="nx">LocalStorage</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;state&#39;</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">state</span><span class="p">));</span>
</span><span class='line'>    <span class="c1">// ... continue as usual</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Load saved state from local storage on page load</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">state</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">LocalStorage</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;state&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that&rsquo;s how we get time-travel debugging:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;time-pos&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">&quot;back&quot;</span><span class="nt">&gt;</span>Back<span class="nt">&lt;/button&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">&quot;next&quot;</span><span class="nt">&gt;</span>Next<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">time</span> <span class="o">=</span> <span class="p">{</span><span class="nx">history</span><span class="o">:</span> <span class="p">[],</span> <span class="nx">pos</span><span class="o">:</span> <span class="mi">0</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateTimeUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#time-pos&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="s1">&#39;Position &#39;</span> <span class="o">+</span> <span class="nx">time</span><span class="p">.</span><span class="nx">pos</span> <span class="o">+</span> <span class="s1">&#39; of &#39;</span> <span class="o">+</span> <span class="nx">time</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">saveState</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">time</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">deepcopy</span><span class="p">(</span><span class="nx">state</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">time</span><span class="p">.</span><span class="nx">pos</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">updateTimeUI</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#back&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Move history pointer</span>
</span><span class='line'>    <span class="nx">time</span><span class="p">.</span><span class="nx">pos</span><span class="o">--</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">updateTimeUI</span><span class="p">();</span>
</span><span class='line'>    <span class="c1">// Load historic state</span>
</span><span class='line'>    <span class="nx">state</span> <span class="o">=</span> <span class="nx">deepcopy</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">history</span><span class="p">[</span><span class="nx">time</span><span class="p">.</span><span class="nx">pos</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#next&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">time</span><span class="p">.</span><span class="nx">pos</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">// ... same</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Save state to history on every change</span>
</span><span class='line'>    <span class="nx">saveState</span><span class="p">();</span>
</span><span class='line'>    <span class="c1">// ... continue as usual</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>On each change of state we push its deep copy to history list and later we can restore that state by simply copying it from history and updating UI to fit it.
I created <a href="http://jsbin.com/fejija/1/edit?js,output">a working clickable demo</a> to illustrate it even more.</p>

<p>Note also how we use the same pattern here? <code>time</code> is the state of time-travel sub-application
and <code>updateTimeUI()</code> is its update function.</p>

<p>Now we can build from that. Undo is just time-travel for user not developer, by saving history to local storage we can preserve it on page reload, by catching errors and sending them along with serialized history to our bug tracker we can automatically reproduce errors our users face.</p>

<p>I should note that React doesn&rsquo;t have all these magical powers, at least out of the box, since it separates app state into pieces and hide it in components.</p>

<h2>Pure Function</h2>

<p>Why do we need pure functions, immutable data and virtual DOM? These are optimizations and to some extent simplifications, not core to idea. Still let&rsquo;s us follow the way that led to them.</p>

<p>First we need a slightly more intricate example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;count&quot;</span><span class="nt">&gt;</span>2<span class="nt">&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>hi<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>there<span class="nt">&lt;/li&gt;</span>
</span><span class='line'><span class="nt">&lt;/ul&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">&quot;add&quot;</span><span class="nt">&gt;&lt;/button&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">state</span> <span class="o">=</span> <span class="p">{</span><span class="nx">items</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;hi&#39;</span><span class="p">,</span> <span class="s1">&#39;there&#39;</span><span class="p">]}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#count&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// Compare ul.childNodes to state.items and make updates</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;ul&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="s1">&#39;li&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">index</span><span class="p">(),</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#add&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">getNextString</span><span class="p">());</span>
</span><span class='line'>    <span class="nx">updateUI</span><span class="p">();</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Several things to see here:</p>

<ul>
<li>there is a duplication between prerendered html and initial state,</li>
<li>update became complex &lsquo;cause we need to compare data structure to DOM.</li>
</ul>


<p>There is a simpler way to do this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;ui&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>...
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">render</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">span</span> <span class="o">=</span> <span class="s1">&#39;&lt;span id=&quot;count&quot;&gt;&#39;</span> <span class="o">+</span> <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">length</span> <span class="o">+</span> <span class="s1">&#39;&lt;/span&gt;&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">lis</span> <span class="o">=</span> <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">item</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">span</span> <span class="o">+</span> <span class="s1">&#39;&lt;ul&gt;&#39;</span> <span class="o">+</span> <span class="nx">lis</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;&lt;/ul&gt;&#39;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#ui&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">render</span><span class="p">(</span><span class="nx">state</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here <code>render()</code> is just pure function from app state to html. And we want it to be pure so that
state will be the single thing defining UI.</p>

<p>In a way UI was a function of state even in our bastardized code, it just wasn&rsquo;t clearly obvious
&lsquo;cause we updated UI, not calculated and rebuilt it from scratch each time. There also was a possibility to screw up and write <code>updateUI()</code> so that UI state is defined both by its own previous state and application state, thus using render is not really an optimization, but a simplification and a guard.</p>

<p>But anyway that&rsquo;s it on pure functions.</p>

<h2>Virtual DOM</h2>

<p>Now look at those <code>render()</code> / <code>$().html()</code> pair, they build entire representation from scratch on each event, probably on every key press. This sounds slow, so we use another optimization &mdash; virtual DOM:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">root</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;ui&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">prevState</span> <span class="o">=</span> <span class="nx">state</span><span class="p">,</span> <span class="nx">prevTree</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">render</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Virtual DOM is really just a tree of JavaScript objects or arrays</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">[</span><span class="s1">&#39;span&#39;</span><span class="p">,</span> <span class="p">{</span><span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;count&#39;</span><span class="p">},</span> <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">length</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s1">&#39;ul&#39;</span><span class="p">,</span> <span class="p">{},</span> <span class="nx">state</span><span class="p">.</span><span class="nx">items</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span>  <span class="p">[</span><span class="s1">&#39;li&#39;</span><span class="p">,</span> <span class="p">{},</span> <span class="nx">item</span><span class="p">]</span>
</span><span class='line'>        <span class="p">})]</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateUI</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">vTree</span> <span class="o">=</span> <span class="nx">render</span><span class="p">(</span><span class="nx">state</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">diff</span> <span class="o">=</span> <span class="nx">vDiff</span><span class="p">(</span><span class="nx">prevTree</span><span class="p">,</span> <span class="nx">vTree</span><span class="p">);</span> <span class="c1">// Just a diff on data structures, haha :)</span>
</span><span class='line'>    <span class="nx">vApply</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">diff</span><span class="p">)</span>                 <span class="c1">// Apply series of patches to real DOM</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">prevState</span> <span class="o">=</span> <span class="nx">deepcopy</span><span class="p">(</span><span class="nx">state</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">prevTree</span> <span class="o">=</span> <span class="nx">vTree</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If any of this diffing/patching sounds complicated to you then you shouldn&rsquo;t worry React or <a href="https://github.com/Matt-Esch/virtual-dom">standalone virtual DOM implementation</a> got you covered. But that&rsquo;s really not that complicated. If you know how to write diffing algorithm then you can surely implement this yourself.</p>

<p>Note that what we just did is a premature optimization. Current simple example will do just fine
with naive render-to-string implementation above. Surprisingly, most of SPAs out there will do just
fine as well, browsers are hell fast these days. I want to stress this once more &ndash; for an average app you can skip React or other virtual DOM at start and only go for it once it gets too slow (or never).</p>

<p>Another stone in Reacts direction: it&rsquo;s virtual DOM is <a href="http://vdom-benchmark.github.io/vdom-benchmark/">one of the slowest ones</a> across the block.</p>

<h2>Immutability</h2>

<p>Noticed all that <code>deepcopy()</code> calls lying around? This looks like a waste (it really is cheap, but bear with me). The idea behind immutable data structures is to build new state based on previous one instead of copying and then mutating it.</p>

<p>Maybe it is still not clear enough, so I&rsquo;ll show you. That&rsquo;s how we make immutable objects in JS:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">object</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">a</span><span class="o">:</span> <span class="p">{</span><span class="nx">x</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">2</span><span class="p">},</span>
</span><span class='line'>    <span class="nx">b</span><span class="o">:</span> <span class="p">{</span><span class="nx">text</span><span class="o">:</span> <span class="s1">&#39;hi&#39;</span><span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Now instead of object.a.y = 3 we do</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">object2</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">a</span><span class="o">:</span> <span class="p">{</span><span class="nx">x</span><span class="o">:</span> <span class="nx">object</span><span class="p">.</span><span class="nx">a</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">3</span><span class="p">},</span>
</span><span class='line'>    <span class="nx">b</span><span class="o">:</span> <span class="nx">object</span><span class="p">.</span><span class="nx">b</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Look how we reuse <code>object.a.x</code> and <code>object.b</code>. This not only saves us from copying, but effectively makes diffs way faster: before diffing <code>object.b</code> and <code>object2.b</code> we just check if they are the same object, which is referential equality, and done &mdash; diff is empty, no need to go all the way down.</p>

<p>One thing to add is this naive approach to immutable collections is not only cumbersome, but also ineffective. Suppose you have an object with lots of keys and a value of one of them changes,
you now need to create a new object with all the same keys (you can still reuse values). You probably don&rsquo;t use such objects, but what about array? Let&rsquo;s see how that looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">prev</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="p">...,</span> <span class="s1">&#39;z&#39;</span><span class="p">];</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">next</span> <span class="o">=</span> <span class="nx">prev</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="nx">concat</span><span class="p">([</span><span class="nx">newValue</span><span class="p">]).</span><span class="nx">concat</span><span class="p">(</span><span class="nx">prev</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">n</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we need to copy the whole thing. Here is a better way to implement immutable sequences:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">prev</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;0-3&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;0-1&#39;</span><span class="o">:</span> <span class="p">{</span><span class="mi">0</span><span class="o">:</span> <span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="o">:</span> <span class="s1">&#39;b&#39;</span><span class="p">},</span>
</span><span class='line'>        <span class="s1">&#39;2-3&#39;</span><span class="o">:</span> <span class="p">{...},</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s1">&#39;4-7&#39;</span><span class="o">:</span> <span class="p">{...}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">next</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;0-3&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;0-1&#39;</span><span class="o">:</span> <span class="nx">prev</span><span class="p">[</span><span class="s1">&#39;0-3&#39;</span><span class="p">][</span><span class="s1">&#39;0-1&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="s1">&#39;2-3&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="mi">2</span><span class="o">:</span> <span class="s1">&#39;hey&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="mi">3</span><span class="o">:</span> <span class="nx">prev</span><span class="p">[</span><span class="s1">&#39;0-3&#39;</span><span class="p">][</span><span class="s1">&#39;2-3&#39;</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s1">&#39;4-7&#39;</span><span class="o">:</span> <span class="nx">prev</span><span class="p">[</span><span class="s1">&#39;4-7&#39;</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can see that we only create <code>log N</code> new objects here and the rest is reused, so even less copying and faster diffs. You also don&rsquo;t need to really deal with all this trees. There are great ready to use implementations out there. E.g. this is how our first example looks with a help of
<a href="https://github.com/facebook/immutable-js">Immutable.js</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">object</span> <span class="o">=</span> <span class="nx">Immutable</span><span class="p">.</span><span class="nx">fromJS</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">a</span><span class="o">:</span> <span class="p">{</span><span class="nx">x</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">2</span><span class="p">},</span>
</span><span class='line'>    <span class="nx">b</span><span class="o">:</span> <span class="p">{</span><span class="nx">text</span><span class="o">:</span> <span class="s1">&#39;hi&#39;</span><span class="p">}</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">object2</span> <span class="o">=</span> <span class="nx">object</span><span class="p">.</span><span class="nx">setIn</span><span class="p">([</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">],</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// object remains intact</span>
</span></code></pre></td></tr></table></div></figure>


<p>It gives you nice API, efficiency and protection against accidentally writing to supposed to be immutable collection. Also take a look at <a href="https://github.com/swannodette/mori">mori</a> &mdash; a set of immutable collections extracted from ClojureScript.</p>

<p>Note that React actually uses naive immutable by convention collections.</p>

<h2>Wrap-up</h2>

<p>It may look from my notes that React is not a good tool, but it is actually very useful one.
It may not have magical powers and top speed, but it got components and is still pretty fast. It also offers ecosystem and community.</p>

<p>And there is one more way to look at it. React made a significant push to front-end development in an interesting direction, including all those virtual DOMs and immutable collection libraries.</p>

<p>Anyway, now that you know all this, you can judge better on what to use and how to structure your code.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Growing Over Backward Incompatibility]]></title>
    <link href="http://suor.github.io/blog/2014/09/07/growing-over-backward-incompatibility/"/>
    <updated>2014-09-07T19:58:00+08:00</updated>
    <id>http://suor.github.io/blog/2014/09/07/growing-over-backward-incompatibility</id>
    <content type="html"><![CDATA[<p>Every language needs to grow. It needs to evolve. However, there is a certain barrier it builds around itself over time called &ldquo;Backward compatibility&rdquo;. Backward compatibility means you can&rsquo;t just change the thing in a best way possible, you need to comply to older design decisions, coincidences and even bugs.</p>

<p>So what should conscious designer do?</p>

<!--more-->


<h2>Possible strategies</h2>

<p>Most languages don&rsquo;t have any explicit strategy for backward incompatible changes, which is pitiful. Mainly because not having a strategy means you are using the worst one. But let&rsquo;s review possible strategies.</p>

<h4>Grow as it goes, then break big</h4>

<p>This results into separation like Python 2/3, Perl 5/6 or even in total abandonment. The major issue is that it creates a gap that most people don&rsquo;t have enough incentive to jump over. It creates additional headache to library developers making hard to support their creations across incompatibility boundary. This in its turn causes chicken and egg problem of no libraries, no users. In its worst separation could divide both ecosystem and community in half, lessening the project considerably.</p>

<h4>Move fast, break things</h4>

<p>Works well in earlier development stages. I never complained when upgrading Node.js from 0.1.x to 0.2.x broke my app as well as several dependencies. However, this effectively reduces library availability, since many authors just can&rsquo;t or interested enough to keep up with the development pace. I was astonished to hear from some of my ruby friends that they avoid using libraries not updated within 3 months as possibly abandoned ones.</p>

<p>It also poses a strain on language users forced to change their coding habits and to constantly seek for and adapt a replacement libraries for abandoned ones. Some of them consequently settle with particular language or framework version causing an erosion of a community and ecosystem.</p>

<h4>Stay small</h4>

<p>&hellip; and useless. A viable strategy for very domain specific or otherwise having narrow field languages, e.g. for education. In any other case wider audience will need language to be extended to be useful for them. The alternative is to stay small &hellip;</p>

<p>&hellip; and provide language extending capabilities. Seems like a good one. However, it hadn&rsquo;t quite worked for lots of lisps and forths. The common issue is that by not providing enough common ground you encourage separating into dialects.</p>

<p>Language of each project gets tailored to project needs, to particular team style. Communities divide, codebases become incompatible effectively narrowing the language for its users and causing confusion for newcomers.</p>

<p>The other issue with both flavors of this approach is that problem is not solved, it&rsquo;s only reduced. There is still no strategy to evolve the core.</p>

<!--
Small standard library with good packaging utilities and service will do the job.
tools do job, language is more subjective.
Unlike libraries frameworks divide people.
 -->


<h4>Rolling deprecation</h4>

<p>This is when you introduce new things leaving old intact, but marking them as deprecated. After several releases deprecated things are removed and new things take their place. Using this strategy you can continuously introduce changes while still providing a compatibility guarantee for several releases. There are, however, some considerations to this strategy.</p>

<p>First, you&rsquo;ll need new API each time you update something in backwards incompatible manner. Say you have a function to parse URLs and it returns a dict of query parameters. It however doesn&rsquo;t handle repetitive params well, it just captures last value. So you decided to update it to return a list instead. This change could break someone&rsquo;s code, so you end up with one of:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">capture_all</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">parse_all</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
</span><span class='line'>    <span class="o">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Your users, respecting deprecation, litter their code with ugly <code>parse(url, True)</code> or <code>parse_all(url)</code> calls. And when finally you get rid of an old <code>parse</code> you need another round of deprecation to return to sane API. On function level this leads to <code>do_something_ex()</code> things, on module level we can see <code>urllib2</code>, <code>newforms</code> and <code>better-assert</code>.</p>

<p>Second, you&rsquo;ll obviously need to ship several implementations for things you change. This hardens managing whatever you are doing a bit. But making life easier for broader group, whatever users, by making it harder for narrower one, whatever developers, is generally a good trade-off.</p>

<p>Third, gradual change is not always possible. Say you want to change how the <code>/</code> operator works in your language. To be compatible it should work the old way in old code and a new way in new one.</p>

<!-- not friendly with semver -->


<h2>Rolling a language</h2>

<p>Making an operator work differently depending on context seems impossible, but also offers a hint to resolve both itself and API uglifying issue. So obviously first we need a way to tell new code from old. The simplest thing is just stating this explicitly, and this is already used in Python 2:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span>
</span></code></pre></td></tr></table></div></figure>


<p>and in Perl 5:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="k">use</span> <span class="n">feature</span> <span class="s">&#39;say&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Python version has file scope and Perls lexical one. Perl also goes farther by bundling features into language versions. E.g. by:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="k">use</span> <span class="n">v5</span><span class="mf">.16</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>you can turn on all 5.16 features, this can also deprecate some old features or alter their behavior. Any old code without that <code>use</code> statement or with the one with earlier version continues to behave the exact way it did. So we can change a language in a backward incompatible manner while still providing compatibility with older code. <!-- What a trick! --></p>

<p>So this is it, the idea I started this post to promote. Lower I&rsquo;ll just address any issues/objections that I can think of.</p>

<h2>Issues</h2>

<p>Let&rsquo;s start from the ones from rolling deprecation section. First (ugly APIs) and last (no way to break) are resolved automatically, second &ndash; the need to ship several implementations bundled &ndash; remains. We can manage that by carefully storing all active implementations and providing a limit on supported versions, e.g. make <code>use v5.10</code> an error in 5.20 version of a language. We&rsquo;ll need to make this span large and stable enough though.</p>

<p>There is also an issue of how do we start this process. It&rsquo;s however rather trivial, say our language is at version 3.4 now, when to add our rolling model in 3.5, we add some form of <code>use</code> statement there and in absence of it just assume 3.4 semantics.</p>

<h3>Easy parts</h3>

<p>These ones are almost automatically solved by version declaration, still some elaboration will probably close unneeded questions.</p>

<p><strong>Syntax changes</strong>. We have a chicken and egg problem like <code>use</code> is part of syntax and it can alter syntax itself. This is however only a problem if we follow Perl 5 lead and allow it anywhere. Although it&rsquo;s cool, it has no relation to solving real problem of &ldquo;using this library written for Blab 2.7 in my Blab 3.4 code&rdquo;. So we can just require every file start with <code>use</code> statement and then parse the rest with appropriate parser. Yes, we&rsquo;ll need to ship several parser implementations, they could share code though.</p>

<p><strong>Semantic changes</strong>. Like we have the same syntactic construction or operator and it should behave in a new way. The beauty of declared version and separate parsers is that we can substitute a thing during parsing. For example, if we get tired of Python semantics of:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">try</span><span class="p">:</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'><span class="k">except</span> <span class="n">E1</span><span class="p">,</span> <span class="n">E2</span><span class="p">:</span> <span class="c"># really means &quot;except E1 as E2:&quot;,</span>
</span><span class='line'>    <span class="o">...</span>        <span class="c"># not catch both as you might expect</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can just make it to parse into the same thing as <code>except (E1, E2)</code>. Altering an AST node resulting from parsing an operator is even easier.</p>

<p><strong>Built-in changes</strong>. Having all new and old built-ins implementations we&rsquo;ll need only arrange that globals are updated on <code>use</code> statement. Globals should be scoped lexically, at least at file level, for this to work. Note that by altering globals we handle all of addition, removal, rename and change of behavior of any built-in.</p>

<p><strong>Standard library changes</strong>. The easiest way is just shipping several versions of it and patching import statement to load appropriate library version. Different versions of standard libs can share code for efficiency, but that&rsquo;s optional.</p>

<h3>Passing over boundary</h3>

<p>Real issues start to arise when we pass something from newer code to older one or vice a versa. Say we have an instance of built-in or standard library type which has changed and pass it to the code that expects to treat it as an instance of an older version of same type.</p>

<p>The simplest thing to do is to provide converters and require a new code interfacing with an older one to use them. This will work, however, it will place significant burden on every forward-looking user of that old code. This is also not future compatible in a sense that if suddenly that old code is updated everyone needs to remove converter calls. And even if we manage somehow to automatically intercept all calls over boundary and convert everything there still be an issues like it could be slow or it would be impossible to share data by reference between newer and older code.</p>

<p>Given all these obstacles, being able to gradually update your code even with a use of converters is significant improvement over major break with just no way to call older code without first updating it. And converters are quite simple thing to implement. But let&rsquo;s take a view into some more elaborate ways to overcome type changes.</p>

<p>Say if a new version of a type has same internal representation and only a new interface then we can pass it as is and rely on some lexical dependent method substitution. This could sound like some unscientific magic, but there is <a href="http://www.ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html">a corresponding feature</a> in ruby 2.0 and sure there is <a href="http://search.cpan.org/~chocolate/Method-Lexical/lib/Method/Lexical.pm">a perl module</a> for that. We can even incorporate active language version into method call semantics, this way changed types should just respond to all their historical interfaces in a support window, which probably won&rsquo;t be more than two.</p>

<p>What if internal representation of a type changes? The thing is that shouldn&rsquo;t matter if nobody looks inside. We should still support all the interfaces and we&rsquo;ll be good. This puts a restriction on a kind of access language users, including library authors, have to instances of built-in types. E.g. if instance data is represented with C struct then we shouldn&rsquo;t allow direct access to its members, casting, etc. Everything should be done via functions or at least macros, which could be updated to handle newer representation.</p>

<h3>Wrap-up</h3>

<p>There are obviously some things I haven&rsquo;t addressed. And this approach doesn&rsquo;t make language developers lives easier. It could however make it more fun both for developers and their users. Cause this way things don&rsquo;t need to stay broken or weird cause that&rsquo;s how they are. An ability to change language in a backward incompatible manner should in the end bring better languages for everyone. It also feels like freedom.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why Every Language Needs Its Underscore]]></title>
    <link href="http://suor.github.io/blog/2014/06/22/why-every-language-needs-its-underscore/"/>
    <updated>2014-06-22T19:39:00+08:00</updated>
    <id>http://suor.github.io/blog/2014/06/22/why-every-language-needs-its-underscore</id>
    <content type="html"><![CDATA[<p><em>(This is an adaptation of a talk I gave at PyCon and DevDay. <a href="http://www.slideshare.net/hackflow/why-underscore">Slides</a> and <a href="http://www.youtube.com/watch?v=lGAC6ftYUS0#t=12100">video</a> are available in russian)</em></p>

<p>Do you know what <a href="http://underscorejs.org/">underscore</a> is? In its most general it&rsquo;s a JavaScript library that makes life better. For whoever writes in JavaScript. I mostly write Python and I also wanted my life better, so I went ahead and wrote <a href="https://github.com/Suor/funcy">a similar library for Python</a>. But the thing is you need to understand a magic behind something to properly replicate it. So what&rsquo;s the magic behind _?</p>

<!--more-->


<h2>The problem</h2>

<p>To answer this question we should look at problems this kind of libraries solve. To get some ground I&rsquo;ll illustrate them with code. That will be in python, but all the ideas are universal, so don&rsquo;t be afraid.</p>

<h3>A piece of entangled code</h3>

<p>This messy piece of code was taken from a real project and slightly simplified:</p>

<div class="example-bad">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">images</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'><span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">):</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="n">images</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">download_image</span><span class="p">(</span><span class="n">url</span><span class="p">))</span>
</span><span class='line'>            <span class="k">break</span>
</span><span class='line'>        <span class="k">except</span> <span class="n">HttpError</span><span class="p">:</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">DOWNLOAD_TRIES</span><span class="p">:</span>
</span><span class='line'>                <span class="k">raise</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>There are several things entangled in here, but my point is that this could be written much shorter:</p>

<div class="example-good">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">http_retry</span> <span class="o">=</span> <span class="n">retry</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">,</span> <span class="n">HttpError</span><span class="p">)</span>
</span><span class='line'><span class="n">images</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">http_retry</span><span class="p">(</span><span class="n">download_image</span><span class="p">),</span> <span class="n">urls</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>If it seems hard at first, then it&rsquo;s okay. It involves some functions and <a href="http://suor.github.io/blog/2013/10/08/abstracting-control-flow/">control flow abstractions</a> most probably new to you. Once you get used to it you&rsquo;ll find that the latter variant is not only shorter, but is also simpler.</p>

<h3>Dirty dictionary</h3>

<p>But let&rsquo;s go on and clean some dirty dictionary:</p>

<div class="example-bad">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">d</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'><span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span class='line'>    <span class="k">try</span><span class="p">:</span>
</span><span class='line'>        <span class="n">d</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
</span><span class='line'>    <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
</span><span class='line'>        <span class="n">d</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>Here we go through dictionary and clean its values by coercing them to <code>int</code>. Or to <code>None</code> if that is impossible. Cleaning input and ignoring malformed data is quite frequent task and yet it takes so much effort. This is the way I want to write that:</p>

<div class="example-good">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">walk_values</span><span class="p">(</span><span class="n">silent</span><span class="p">(</span><span class="nb">int</span><span class="p">),</span> <span class="n">request</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>And it&rsquo;s entirely possible with <a href="https://github.com/Suor/funcy">funcy</a>. But let&rsquo;s move to the next one.</p>

<h3>Pairwise iteration</h3>

<p>This code checks if a sequence is ascending:</p>

<div class="example-bad">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span>
</span><span class='line'><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">:</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">prev</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">prev</span><span class="p">:</span>
</span><span class='line'>        <span class="n">is_ascending</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>        <span class="k">break</span>
</span><span class='line'>    <span class="n">prev</span> <span class="o">=</span> <span class="n">x</span>
</span><span class='line'><span class="k">else</span><span class="p">:</span>
</span><span class='line'>    <span class="n">is_ascending</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>Ah, iterating over a sequence and keeping track of a previous element. How many times had you done that? There should be a function to abstract it:</p>

<div class="example-good">
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">is_ascending</span> <span class="o">=</span> <span class="nb">all</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;</span> <span class="n">r</span> <span class="k">for</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">pairwise</span><span class="p">(</span><span class="n">seq</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>
</div>


<p>And <a href="http://funcy.readthedocs.org/en/latest/seqs.html#pairwise">pairwise</a> does exactly that. It enables us to iterate by sequence adjacent pairs. So we just need to check that all of them are ordered accordingly.</p>

<h3>&hellip;</h3>

<p>All these examples have one common property &mdash; red variants have more code. And more code:</p>

<ul>
<li>takes longer to write,</li>
<li>takes longer to read,</li>
<li>takes longer to debug,</li>
<li>contains more bugs.</li>
</ul>


<p>Obviously, underscore, funcy and friends help us write less code (at least in these three examples). But how do they do that?</p>

<h2>Extracting abstractions</h2>

<p>Let&rsquo;s take another look at the first example. It does three things in a single blob of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code><span class='green'>images</span> <span class='blue'>= []
</span><span class='blue'>for url in</span> <span class='green'>urls</span><span class='blue'>:
</span><span class='red'>    for attempt in range(DOWNLOAD_TRIES):
</span><span class='red'>        try:
</span><span class='green'>            images</span><span class='blue'>.append(</span><span class='green'>download_image(</span><span class='blue'>url</span><span class='green'>)</span><span class='blue'>)
</span><span class='red'>            break
</span><span class='red'>        except HttpError:
</span><span class='red'>            if attempt + 1 == DOWNLOAD_TRIES:
</span><span class='red'>                <span class="k">raise
</span></code></pre></td></tr></table></div></figure>


<p>I highlighted every aspect of this code with separate color:</p>

<ul>
<li>image download (green),</li>
<li>retries on fails (red),</li>
<li>iteration through urls and result collection (blue).</li>
</ul>


<p>As you can see, three colors are interleaved here. This hints that corresponding aspects are entangled. And by &ldquo;entangled&rdquo; I mean they can not be reused separately. Say we need retries on fails in some other place, we will probably end up copying the whole block and updating it somewhat. Not exactly the best practice &ldquo;code reuse&rdquo;.</p>

<p>If, on the other hand, we managed to separate reties then our code will look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code><span class='red'>def retry(...):
    ...

http_retry = retry(DOWNLOAD_TRIES, HttpError)
</span><span class='green'>images</span> <span class='blue'>= []
</span><span class='blue'>for url in</span> <span class='green'>urls</span><span class='blue'>:
</span><span class='green'>    images</span><span class='blue'>.append(</span><span class='red'>http_retry(</span><span class='green'>download_image</span><span class='red'>)</span><span class='blue'>(url))
</span></code></pre></td></tr></table></div></figure>


<p>Now red code is nicely grouped at the top. Green and blue are still mixed, but now they represent a pattern so common that most modern languages have a builtin function to handle that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code><span class='red'>def retry(...):
    ...

http_retry = retry(DOWNLOAD_TRIES, HttpError)
</span><span class='green'>images</span> <span class='blue'>= map(<span class='red'>http_retry(</span><span class='green'>download_image</span><span class='red'>)</span><span class='blue'>, <span class='green'>urls</span><span class='blue'>)
</span></code></pre></td></tr></table></div></figure>


<p>This last variant has some lovely traits: each part of a task at hand (downloading images) appear only once, the whole iteration aspect is handled with a single <code>map()</code> call and retries are abstracted out into <a href="http://funcy.readthedocs.org/en/latest/flow.html#retry">the retry function</a>.</p>

<p>Extracting common behavior into a higher order functions is a first trick underscore and funcy use to make your life better.</p>

<h2>Hiding low level</h2>

<p>It&rsquo;s time to go back to second example. I&rsquo;ll throw away error handling to make snippets more even:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Using function</span>
</span><span class='line'><span class="n">walk_values</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Using dict comprehension</span>
</span><span class='line'><span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now they are both one-liners, so how is first one better? Let&rsquo;s identify every single distinct component of each code variant:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># 3 components</span>
</span><span class='trend3'>walk_values(</span><span class='trend4'>int</span><span class='trend3'>,</span> <span class='trend8'>request</span><span class='trend3'>)
</span><span class='line'>
</span><span class='line'><span class="c"># 8 or so components</span>
</span><span class='line'><span class='trend3'>{</span><span class='trend0'>k</span><span class='trend3'>:</span> <span class='trend4'>int(</span><span class='trend6'>v</span><span class='trend4'>)</span> <span class='trend9'>for</span> <span class='trend0'>k</span><span class='trend7'>,</span> <span class='trend6'>v</span> <span class='trend9'>in</span> <span class='trend8'>request</span><span class='trend5'>.items()</span><span class='trend3'>}
</span></code></pre></td></tr></table></div></figure>


<p>The second one looks like rainbow. But besides looking nice this means each time you write or read it you need to load all those components into your head, taking up all your cognitive resources. This is how first line is better.</p>

<p>That could be highlighted in even more obvious manner:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='trend3'>walk_values(int, request)
</span><span class='line'>
</span><span class='line'><span class="c"># red are low-level details</span>
</span><span class='line'><span class='trend3'>{</span><span class='trend8'>k</span><span class='trend3'>: int(</span><span class='trend8'>v</span><span class='trend3'>)</span> <span class='trend8'>for k, v in</span> <span class='trend3'>request</span><span class='trend8'>.items()</span><span class='trend3'>}
</span></code></pre></td></tr></table></div></figure>


<p>This way we can see that about a half of the second line is low-level details. And low-level mean you don&rsquo;t need to know all those details to understand what&rsquo;s going on.</p>

<p>Hiding low-level details is the second way such libraries make your life better.</p>

<h2>Enriching our language</h2>

<p>I&rsquo;ll translate the last example into natural language:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span>
</span><span class='line'><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">:</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">prev</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">prev</span><span class="p">:</span>
</span><span class='line'>        <span class="n">is_ascending</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>        <span class="k">break</span>
</span><span class='line'>    <span class="n">prev</span> <span class="o">=</span> <span class="n">x</span>
</span><span class='line'><span class="k">else</span><span class="p">:</span>
</span><span class='line'>    <span class="n">is_ascending</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'><span class="c"># Starting with empty prev, iterate over seq, bookkeeping prev actuality,</span>
</span><span class='line'><span class="c"># on each cycle if prev is present and current element is less or equal than it</span>
</span><span class='line'><span class="c"># then set is_ascending to False and break.</span>
</span><span class='line'><span class="c"># If loop wasn&#39;t broken set is_ascending to True</span>
</span><span class='line'>
</span><span class='line'><span class="n">is_ascending</span> <span class="o">=</span> <span class="nb">all</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;</span> <span class="n">r</span> <span class="k">for</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">pairwise</span><span class="p">(</span><span class="n">seq</span><span class="p">))</span>
</span><span class='line'><span class="c"># set is_ascending to all left elements being smaller than right</span>
</span><span class='line'><span class="c"># in adjacent pairs of seq</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously, more code emits more text. Higher level code generates an explanation utilizing higher level abstractions. This way we can use bigger building blocks not only in coding, but in problem solving.</p>

<p>And this is the third way _ makes your life better.</p>

<h2>Wrap-up</h2>

<p>All the things we came through are completely language independent. So there gotta be underscore for every language? Not quite, and more importantly a straight-forward port is not always a great idea: common behaviors to abstract vary per language and especially per application. The right approach would be to follow core ideas. Or look around if someone have already done that.</p>

<p>Here are some leads for you to take:</p>

<table>
<thead>
<tr>
<th>Language    </th>
<th> Libraries</th>
</tr>
</thead>
<tbody>
<tr>
<td>JavaScript  </td>
<td> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype">Array</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype">Function</a>, <a href="http://underscorejs.org/">Underscore</a>, <a href="http://lodash.com/">lowdash</a></td>
</tr>
<tr>
<td>Python      </td>
<td> <a href="https://docs.python.org/2/library/itertools.html">itertools</a>, <a href="https://docs.python.org/2/library/functools.html">functools</a>, <a href="https://github.com/Suor/funcy">funcy</a>, <a href="https://github.com/pytoolz/toolz">toolz</a>, <a href="https://github.com/kachayev/fn.py">fn.py</a></td>
</tr>
<tr>
<td>Ruby        </td>
<td> <a href="http://www.ruby-doc.org/core/Enumerable.html">Enumerable</a>, <a href="http://guides.rubyonrails.org/active_support_core_extensions.html">ActiveSupport</a></td>
</tr>
<tr>
<td>PHP         </td>
<td> <a href="https://github.com/lstrojny/functional-php">functional-php</a>, <a href="https://github.com/brianhaveri/Underscore.php">Underscore.php</a></td>
</tr>
<tr>
<td>Clojure     </td>
<td> <a href="http://richhickey.github.io/clojure/clojure.core-api.html">clojure.core</a></td>
</tr>
<tr>
<td>Java        </td>
<td> <a href="http://functionaljava.org/">FunctionalJava</a></td>
</tr>
<tr>
<td>C#          </td>
<td> <a href="http://msdn.microsoft.com/ru-ru/library/bb397926.aspx">LINQ</a></td>
</tr>
<tr>
<td>Objective-C </td>
<td> <a href="http://underscorem.org/">Underscore.m</a></td>
</tr>
</tbody>
</table>


<p><strong>P.S.</strong> You may also want to look at <a href="http://www.scala-lang.org/">Scala</a> if you are using JVM and at <a href="http://www.tryfsharp.org/">F#</a> if it&rsquo;s .NET.</p>

<p><strong>P.P.S.</strong> Please stop commenting on Hacker News, a controversial penalty is killing this post. Use <a href="http://www.reddit.com/r/programming/comments/28se2h/why_every_language_needs_its_underscore/">reddit thread</a> instead. Sadly, HN is not a place for discussions anymore.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On ORM Cache Invalidation]]></title>
    <link href="http://suor.github.io/blog/2014/03/09/on-orm-cache-invalidation/"/>
    <updated>2014-03-09T19:50:00+08:00</updated>
    <id>http://suor.github.io/blog/2014/03/09/on-orm-cache-invalidation</id>
    <content type="html"><![CDATA[<p>Cache invalidation is probably one of the hardest things in computer programming. I understand it as finding a subtle compromise between completeness, redundancy and complexity. I would like to tap into this topic in a context of caching queries built via ORM.</p>

<!--more-->


<p>I will move from basic ideas building upon them as needed and diving into more and more specifics as the post goes.</p>

<h2>Completeness and redundancy</h2>

<p>Let&rsquo;s start from some general considerations. I define abovesaid completeness as a characteristic of invalidation procedure describing how frequent and under what circumstances data can become dirty and how long it will remain accessible. And redundancy will be a frequency and a volume of cache invalidated needlessly.</p>

<p>An example will help us perceive these two concepts better. Let&rsquo;s look at common time-invalidated cache. On one hand, it inevitably leads to dirty data between update and cache timeout, making this algorithm inherently incomplete. On other hand, we can easily reduce incompleteness by reducing cache timeout, which, in it&rsquo;s turn, will increase redundancy &ndash; clean cache data will be invalidated more frequently, which will lead to more cache misses. And for ideal completeness (no dirty data) we need to set timeout to zero.</p>

<p>There are lots of scenarios where it&rsquo;s ok to use stale data: popular articles list doesn&rsquo;t change fast and it&rsquo;s not a big deal if user count of your social network is off by a couple of thousands. But then there are some scenarios where you need immediate invalidation, go to next section for that.</p>

<h2>Event-driven invalidation</h2>

<p>Probably, the only way to achieve ideal invalidation completeness is to invalidate each time you change data. These are elements of such system we need to think about:</p>

<ul>
<li>cached things,</li>
<li>events,</li>
<li>a dependency matrix explaining what thing to invalidate on what event.</li>
</ul>


<p>There are obviously different strategies to define those in your code. I&rsquo;ll start from simplest one &ndash; manual definition.</p>

<h2>Coding dependencies by hand</h2>

<p>First, cached things, they will probably look like this (in sort of python pseudo-code):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># An ellipsis means some code or instruction to get corresponding data</span>
</span><span class='line'><span class="n">register_cached_item</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
</span><span class='line'><span class="n">register_cached_item</span><span class="p">(</span><span class="s">&#39;posts_by_category&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
</span><span class='line'><span class="n">register_cached_item</span><span class="p">(</span><span class="s">&#39;recent_posts&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
</span><span class='line'><span class="n">register_cached_item</span><span class="p">(</span><span class="s">&#39;posts_by_tag&#39;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Used like</span>
</span><span class='line'><span class="n">post</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span><span class='line'><span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Remember this is pseudo-code. <code>register_cached_item()</code> doesn&rsquo;t need to be a function call, it could be a decorator in Python, a macro in lisp or a class in Java.</p>

<p>Ok, say we have some place in our code that adds post, we then need to add something like this there:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># ...</span>
</span><span class='line'><span class="c"># Just added post, need to invalidate things</span>
</span><span class='line'><span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="n">post</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'><span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;posts_by_category&#39;</span><span class="p">,</span> <span class="n">post</span><span class="o">.</span><span class="n">category_id</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># It could be recent</span>
</span><span class='line'><span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;recent_posts&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Invalidate for all tags</span>
</span><span class='line'><span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">post</span><span class="o">.</span><span class="n">tags</span><span class="p">:</span>
</span><span class='line'>    <span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;posts_by_tag&#39;</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And if we delete post somewhere we need to make invalidation there too. We should obviously abstract our code into some <code>invalidate_post()</code> function and call it from both places. So far, so good. What about updating? The thing is it&rsquo;s not enough to just call our invalidation procedure from there:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">post</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span><span class='line'><span class="k">assert</span> <span class="n">post</span><span class="o">.</span><span class="n">category</span> <span class="o">==</span> <span class="mi">1</span>
</span><span class='line'><span class="n">post</span><span class="o">.</span><span class="n">category</span> <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'>
</span><span class='line'><span class="n">update_post</span><span class="p">(</span><span class="n">post</span><span class="p">)</span>
</span><span class='line'><span class="n">invalidate_post</span><span class="p">(</span><span class="n">post</span><span class="p">)</span> <span class="c"># &#39;posts_by_category&#39; not invalidated for category 1!</span>
</span></code></pre></td></tr></table></div></figure>


<p>We need to invalidate on both old and new states of a post on update. How we get old state is a separate not an easy question, but suppose we have both states, should we just call <code>invalidate_post()</code> twice for each of them? Not so efficient, but that would work.</p>

<p>There is a problem with our code though. It&rsquo;s tightly coupled &ndash; update logic knows about cache logic. Even bigger problem is that our cache logic is scattered. We define cached thing in one place and invalidate in another or several other places. This means there will come some day when someone will add a cached thing and just forget to add corresponding invalidation, producing hard to find bug.</p>

<h2>Bringing things together</h2>

<p>Fortunately, there is a single solution to both problems &ndash; events. We can write fetching and invalidation logic for each thing in one place and then register both cached thing and event listener:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">post_by_id</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">invalidate_post_by_id</span><span class="p">(</span><span class="n">post</span><span class="p">):</span> <span class="c"># event signature here</span>
</span><span class='line'>    <span class="n">invalidate</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="n">post</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">register_cached_thing</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="n">fetch</span><span class="o">=</span><span class="n">post_by_id</span><span class="p">,</span> <span class="n">invalidate</span><span class="o">=</span><span class="n">invalidate_post_by_id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>As invalidate procedures would be tiresomely repetitive we can dry this up to (and even further using particular language sugar features):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">post_by_id</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ...</span>
</span><span class='line'><span class="n">register_cached_thing</span><span class="p">(</span><span class="s">&#39;post_by_id&#39;</span><span class="p">,</span> <span class="n">fetch</span><span class="o">=</span><span class="n">post_by_id</span><span class="p">,</span> <span class="n">arg</span><span class="o">=</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="n">p</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looks like we&rsquo;ve come up with pretty solid system. It&rsquo;s dry, but retains flexibility of still mostly manual system. We, however, need to declare each thing we plan to cache in advance. We also need to provide argument constructing functions. There got to be a smarter way.</p>

<h2>Automatic invalidation</h2>

<p>We have not even started utilizing a power of ORM. Its query is not a mere text and plain arguments, it is a structure which includes condition tree. And some smart code could use that information to determine when query cache should be invalidated, saving work for lazy guys like me.</p>

<p>Suppose we cache a query:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span>
</span></code></pre></td></tr></table></div></figure>


<p>We should drop that cache when we add, update or delete post with its old or new state satisfying <code>category_id = 2 and published</code> condition. So the time we save that cache we should write along &ldquo;invalidator&rdquo; like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span><span class="p">:</span> <span class="n">K1</span> <span class="c1">-- K1 is above query cache key</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then if some post changes we look up all invalidators and check their conditions with post at hand, deleting cache keys corresponding to holding ones. That could become very inefficient once we&rsquo;ll have lots of queries cached.</p>

<p>The reason we will end up with lots of invalidators is that we have cached lots of different queries. In common use, however, most queries will differ only in parameters not structure. Maybe separating those will help us? Let&rsquo;s try on larger example. Here be the queries:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span>           <span class="c1">-- K1</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span> <span class="k">limit</span> <span class="mi">20</span>  <span class="c1">-- K2</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">published</span>           <span class="c1">-- K3</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="k">not</span> <span class="n">published</span>       <span class="c1">-- K4</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">id</span> <span class="o">&gt;</span> <span class="mi">7</span>                                  <span class="c1">-- K5</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span> <span class="k">or</span> <span class="n">id</span> <span class="o">&gt;</span> <span class="mi">7</span> <span class="c1">-- K6</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="k">in</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="k">and</span> <span class="n">published</span>     <span class="c1">-- K7</span>
</span><span class='line'><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">post</span> <span class="k">where</span> <span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">id</span> <span class="o">&lt;</span> <span class="mi">7</span>              <span class="c1">-- K8</span>
</span></code></pre></td></tr></table></div></figure>


<p>Unseparated invalidators first:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span><span class="p">:</span>           <span class="n">K1</span><span class="p">,</span> <span class="n">K2</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">published</span><span class="p">:</span>           <span class="n">K3</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="k">not</span> <span class="n">published</span><span class="p">:</span>       <span class="n">K4</span>
</span><span class='line'><span class="n">id</span> <span class="o">&gt;</span> <span class="mi">7</span><span class="p">:</span>                                  <span class="n">K5</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span> <span class="k">or</span> <span class="n">id</span> <span class="o">&gt;</span> <span class="mi">7</span><span class="p">:</span> <span class="n">K6</span>
</span><span class='line'><span class="n">category_id</span> <span class="k">in</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="k">and</span> <span class="n">published</span><span class="p">:</span>     <span class="n">K7</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">id</span> <span class="o">&lt;</span> <span class="mi">7</span><span class="p">:</span>              <span class="n">K8</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can use some tricks to make this more regular. <code>or</code>ed conditions could be split into two, <code>in</code> is basically syntax sugar for <code>or</code> and boolean tests could be substituted with equalities. Applying these we get to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="k">and</span> <span class="n">published</span> <span class="o">=</span> <span class="k">true</span><span class="p">:</span>  <span class="n">K1</span><span class="p">,</span> <span class="n">K2</span><span class="p">,</span> <span class="n">K6</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">published</span> <span class="o">=</span> <span class="k">true</span><span class="p">:</span>  <span class="n">K3</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">published</span> <span class="o">=</span> <span class="k">false</span><span class="p">:</span> <span class="n">K4</span>
</span><span class='line'><span class="n">id</span> <span class="o">&gt;</span> <span class="mi">7</span><span class="p">:</span>                                <span class="n">K5</span><span class="p">,</span> <span class="n">K6</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">and</span> <span class="n">id</span> <span class="o">&lt;</span> <span class="mi">7</span><span class="p">:</span>            <span class="n">K8</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that after this transformation all conditions became simple conjunctions. And we are finally ready to separate condition scheme from data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="c1">-- Schemes</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="o">?</span> <span class="k">and</span> <span class="n">published</span> <span class="o">=</span> <span class="o">?</span> <span class="c1">-- S1</span>
</span><span class='line'><span class="n">id</span> <span class="o">&gt;</span> <span class="o">?</span>                            <span class="c1">-- S2</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="o">?</span> <span class="k">and</span> <span class="n">id</span> <span class="o">&lt;</span> <span class="o">?</span>        <span class="c1">-- S3</span>
</span><span class='line'>
</span><span class='line'><span class="c1">-- Conjunctions</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="k">true</span><span class="p">:</span>  <span class="n">K1</span><span class="p">,</span> <span class="n">K2</span><span class="p">,</span> <span class="n">K6</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="k">true</span><span class="p">:</span>  <span class="n">K3</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="k">false</span><span class="p">:</span> <span class="n">K4</span>
</span><span class='line'><span class="n">S2</span><span class="p">:</span><span class="mi">7</span><span class="p">:</span>       <span class="n">K5</span><span class="p">,</span> <span class="n">K6</span>
</span><span class='line'><span class="n">S3</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="mi">7</span><span class="p">:</span>     <span class="n">K8</span>
</span></code></pre></td></tr></table></div></figure>


<p>Time to try modeling invalidation procedure. Say we are adding this post to our stock:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="err">{</span><span class="n">id</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="n">category_id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">published</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span> <span class="n">title</span><span class="p">:</span> <span class="ss">&quot;...&quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="ss">&quot;...&quot;</span><span class="err">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looking at <code>S1</code> we can see that there is at most one conjunction of that scheme satisfying our state! Even better, we can build it from scheme and object data by looking at field values: each known value is equal only to itself. Too bad the trick won&rsquo;t work with <code>S2</code> cause our post id, 42, is greater than many things. To find what queries of scheme <code>S2</code> should be invalidated one needs to look through all <code>S2:*</code> conjunctions and that could be a lot.</p>

<p>This is probably a case for trade-off. Dropping all conditions but equalities we will sacrifice invalidation granularity, but simplify and speed up the procedure. Simplified invalidators will look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="c1">-- Schemes</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="o">?</span> <span class="k">and</span> <span class="n">published</span> <span class="o">=</span> <span class="o">?</span> <span class="c1">-- S1</span>
</span><span class='line'>                                  <span class="c1">-- S2, an empty scheme</span>
</span><span class='line'><span class="n">category_id</span> <span class="o">=</span> <span class="o">?</span>                   <span class="c1">-- S3</span>
</span><span class='line'>
</span><span class='line'><span class="c1">-- Conjunctions</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="k">true</span><span class="p">:</span>  <span class="n">K1</span><span class="p">,</span> <span class="n">K2</span><span class="p">,</span> <span class="n">K6</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="k">true</span><span class="p">:</span>  <span class="n">K3</span><span class="p">,</span> <span class="n">K7</span>
</span><span class='line'><span class="n">S1</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span><span class="k">false</span><span class="p">:</span> <span class="n">K4</span>
</span><span class='line'><span class="n">S2</span><span class="p">::</span>        <span class="n">K5</span><span class="p">,</span> <span class="n">K6</span> <span class="c1">-- no data for S2</span>
</span><span class='line'><span class="n">S3</span><span class="p">:</span><span class="mi">3</span><span class="p">:</span>       <span class="n">K8</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are some points worth noting here. First, <code>S2</code> is now an empty scheme with a single empty conjunction which is always true, which means <code>K5</code> and <code>K6</code> will be invalidated on any post change. Second, schemes are now just sets of field names, pretty neat.</p>

<p>So far I tried to stay language and platform agnostic, but that journey came to an end. Welcome to dirty reality in the next section.</p>

<h2>Implementation tips</h2>

<ul>
<li><p>A best way to represent scheme is probably alphabetically sorted list of field names, it&rsquo;s easily serializable and it makes building a conjunction for an object pretty straightforward.</p></li>
<li><p>Extracting conjunctions from a query tree could be tricky. One might want to employ <a href="http://en.wikipedia.org/wiki/Fuzzy_logic">fuzzy logic</a>: look at <code>not (f &gt; 0 and g != 1)</code>, if we drop <code>f &gt; 0</code> right away, we&rsquo;ll end up with <code>g = 1</code>, which is not equivalent to <code>f &lt;= 0 or g = 1</code>. Lost empty conjunction along the way!</p></li>
<li><p>Considering invalidator structure (sets) and taking into account that it is generally a good idea to keep all interdependent data together (cache and invalidators) this is an excellent case to use <a href="http://redis.io">Redis</a>. Using it we can easily add keys to conjunctions, we can even do <code>SUNION</code> of conjunctions to fetch all dirty keys in one shot.</p></li>
</ul>


<p>Sure, I went ahead and used that tips in my <a href="https://github.com/Suor/django-cacheops">Django caching solution</a>. Hope it or the ideas it embodies would be helpful.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Painless Decorators]]></title>
    <link href="http://suor.github.io/blog/2013/11/03/painless-decorators/"/>
    <updated>2013-11-03T20:07:00+08:00</updated>
    <id>http://suor.github.io/blog/2013/11/03/painless-decorators</id>
    <content type="html"><![CDATA[<p>Decorators are joy to use. Write? Not so much. One needs to mess with wrappers, function metadata and a fair amount of bookkeeping. Enough things to bury any useful semantics under them. There got to be a better way.</p>

<p>Let&rsquo;s find that out.</p>

<!--more-->


<h2>Current state</h2>

<p>Currently in a decorator you need to create a wrapper, update it&rsquo;s metadata and then return it. You also need to pass arguments and result value in and out carefully. A typical pattern would be:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">some_decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span><span class='line'>    <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># ... do something before</span>
</span><span class='line'>        <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>        <span class="c"># ... do something after</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">wrapper</span>
</span></code></pre></td></tr></table></div></figure>


<p>And if you want decorator with arguments it becomes even harder:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">some_decorator</span><span class="p">(</span><span class="n">before</span><span class="p">,</span> <span class="n">after</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span><span class='line'>        <span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span class='line'>        <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>            <span class="n">before</span><span class="p">()</span>
</span><span class='line'>            <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>            <span class="n">after</span><span class="p">()</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">result</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">decorator</span>
</span></code></pre></td></tr></table></div></figure>


<p>Look at that code for a minute. What a mess! And this is not about typing, it&rsquo;s really hard to see through to the point of it.</p>

<p>Let&rsquo;s see what is meaningful and what is a boilerplate here. What we care about is concentrated in <code>wrapper</code> function, it&rsquo;s <code>before</code> and <code>after</code> calls, how they surround original function call, what arguments are passed to it and what is returned. The name <code>some_decorator</code> and its arguments also matter. Anything else &ndash; nested functions and returns, <code>@wraps</code> and all extra indent &ndash; is just <a href="http://suor.github.io/blog/2013/10/08/abstracting-control-flow/">code pattern waiting to be abstracted</a>.</p>

<h2>Removing a boilerplate</h2>

<p>What we probably want to see (or write) is some flat syntax with code showing only wrapper semantics. Something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">some_decorator</span><span class="p">(</span><span class="o">...</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ... do something before</span>
</span><span class='line'>    <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># ... do something after</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously <code>func</code>, <code>args</code> and <code>kwargs</code> should come from somewhere as well as all the magic turning plain function into decorator. Suppose we have <code>@decorator</code> to handle the conversion and the easiest way to provide all values is just enclosing them as <code>some_decorator</code> arguments:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">some_decorator</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ... do something before</span>
</span><span class='line'>    <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># ... do something after</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span>
</span></code></pre></td></tr></table></div></figure>


<p>Calling decorated function with the same arguments as its wrapper is a pattern so common that we should abstract that too. Also, our decorator may become too cluttered once we start adding its own arguments. To keep this clean we can substitute three call related arguments with a single <code>call</code> object:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">some_decorator</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ... do something before</span>
</span><span class='line'>    <span class="n">result</span> <span class="o">=</span> <span class="n">call</span><span class="p">()</span>
</span><span class='line'>    <span class="c"># ... do something after</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looks simple and to the point. Something we were looking for. And once we have a clear view we can go ahead and implement the magic. Actually, you can <a href="https://pypi.python.org/pypi/funcy">download it from pypi</a> right now and import it with <code>from funcy import decorator</code>.</p>

<h2>Advanced usage</h2>

<p>We seemingly lost a couple of features in our quest for simplicity: access to call arguments, function itself, ability to call function differently and create decorators with arguments. But that&rsquo;s not the case really, we can pack all these into <code>call</code> object. I&rsquo;ll go through everything with better examples than you saw so far.</p>

<h3>Accessing function arguments</h3>

<p>You didn&rsquo;t expect a post about decorators without logging example, did you? Anyway, it&rsquo;s an excellent way to show how you can access not only call arguments but decorated function itself:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
</span><span class='line'>    <span class="k">print</span> <span class="s">&quot;Calling </span><span class="si">%s</span><span class="s"> with args </span><span class="si">%s</span><span class="s"> and kwargs </span><span class="si">%s</span><span class="s">&quot;</span>         \
</span><span class='line'>        <span class="o">%</span> <span class="p">(</span><span class="n">call</span><span class="o">.</span><span class="n">_func</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">call</span><span class="o">.</span><span class="n">_args</span><span class="p">,</span> <span class="n">call</span><span class="o">.</span><span class="n">_kwargs</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">call</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, everything is underscore-prefixed, this is done to avoid clashes with function argument names, the values of which are binded to <code>call</code> object as attributes. Pretty handy if you are writing something more specific than logging decorator. Look at this simplified <code>login_required</code> decorator to get a foretaste:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">login_required</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">call</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_authenticated</span><span class="p">():</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">call</span><span class="p">()</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">LOGIN_URL</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Altering calls</h3>

<p>Is considered a bad practice cause it makes code harder to read. However, this could be useful occasionally and I am not into childproofing anyway. The obvious way to do it is just using plain function carefully stored in <code>call._func</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">int_args</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;Coerces any function arguments to ints&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">call</span><span class="o">.</span><span class="n">_func</span><span class="p">(</span><span class="o">*</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">call</span><span class="o">.</span><span class="n">_args</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>But a common use-case of passing some extra data to function could be written with more elegance:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">with_phone</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
</span><span class='line'>    <span class="n">phone</span> <span class="o">=</span> <span class="n">Phone</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">number</span><span class="o">=</span><span class="n">call</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">[</span><span class="s">&#39;phone&#39;</span><span class="p">])</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">call</span><span class="p">(</span><span class="n">phone</span><span class="p">)</span> <span class="c"># phone is added to *args passed to decorated function</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@with_phone</span>
</span><span class='line'><span class="k">def</span> <span class="nf">some_view</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">phone</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ... some code using phone</span>
</span></code></pre></td></tr></table></div></figure>


<p>This works with named arguments too, and is probably a better way since you won&rsquo;t run into problems with arguments order.</p>

<h3>Decorators with arguments</h3>

<p>To get these you just add your arguments after <code>call</code> as in this <a href="http://suor.github.io/blog/2013/10/08/abstracting-control-flow/">control flow abstracting</a> retry decorator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">retry</span><span class="p">(</span><span class="n">call</span><span class="p">,</span> <span class="n">tries</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="ne">Exception</span><span class="p">):</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">tries</span><span class="p">):</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">call</span><span class="p">()</span>
</span><span class='line'>        <span class="k">except</span> <span class="n">errors</span><span class="p">:</span>
</span><span class='line'>            <span class="c"># Reraise error on last attempt</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">tries</span><span class="p">:</span>
</span><span class='line'>                <span class="k">raise</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Why use that?</h2>

<p>There are obvious reasons: to reduce clutter and expose your intentions. However, there is usual cost. This as any abstraction brings an additional layer of complexity on top of python. And python could be seen as a layer on top of c, and that as one above asm, and that &hellip;</p>

<p>You can choose for yourself what level is too high. And if python is sometimes not enough high level language for you then you should definitely upgrade it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Functional Python Made Easy]]></title>
    <link href="http://suor.github.io/blog/2013/10/13/functional-python-made-easy/"/>
    <updated>2013-10-13T19:22:00+08:00</updated>
    <id>http://suor.github.io/blog/2013/10/13/functional-python-made-easy</id>
    <content type="html"><![CDATA[<p>There are a lot of buzz about Haskell, Lisp, Erlang and other languages few people code in. But while they play their role as banners, functional programming sneaks into our code in multi-paradigm languages.</p>

<p>I was going to continue this way and later introduce my library of a variety of functional tricks, but suddenly realized it&rsquo;s not about FP, it&rsquo;s about utility. And that&rsquo;s what I will focus on below trying to show you real-life value of <a href="https://github.com/Suor/funcy">funcy</a>.</p>

<!--more-->


<p>Funcy started from a try to bunch up a couple of data manipulation utils. Therefore most of my examples will be about that. Some of them may seem trivial to you, but there are many gains these tiny tools can offer you both in terms of code brevity and expressiveness. Or they&rsquo;ll just save your time, still good.</p>

<p>I&rsquo;ll go through the typical tasks any python programmer face during her day.</p>

<h2>Everyday data manipulation</h2>

<p><em>1. Flatten list of lists. That&rsquo;s how you usually do it:</em></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">operator</span> <span class="kn">import</span> <span class="n">concat</span>
</span><span class='line'><span class="nb">reduce</span><span class="p">(</span><span class="n">concat</span><span class="p">,</span> <span class="n">list_of_lists</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># or that:</span>
</span><span class='line'><span class="nb">sum</span><span class="p">(</span><span class="n">list_of_lists</span><span class="p">,</span> <span class="p">[])</span>
</span><span class='line'>
</span><span class='line'><span class="c"># or that:</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">chain</span>
</span><span class='line'><span class="nb">list</span><span class="p">(</span><span class="n">chain</span><span class="o">.</span><span class="n">from_iterable</span><span class="p">(</span><span class="n">list_of_lists</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>They all work and all have their flaws: require imports, additional calls or restrict what you can pass into. But the main flaw is that they are all patterns not obvious calls. There should be a simple function to do such a simple and common thing and there is one in funcy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="n">cat</span>
</span><span class='line'><span class="n">cat</span><span class="p">(</span><span class="n">list_of_lists</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>cat</code> joins list of lists, tuples, iterators and generally any iterables into single list. And it comes with extra shortcut if you want to <code>cat</code> results of <code>map</code> call. For example, this</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="n">mapcat</span>
</span><span class='line'><span class="n">mapcat</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">splitlines</span><span class="p">,</span> <span class="n">bunch_of_texts</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>will result in flat list of all lines of all the texts. There are lazy versions of both functions: <code>icat</code> and <code>imapcat</code>.</p>

<p><em>2. Merge some dicts. There are several clumsy ways in python:</em></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">d1</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span>  <span class="c"># Changes d1</span>
</span><span class='line'><span class="nb">dict</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="o">**</span><span class="n">d2</span><span class="p">)</span> <span class="c"># Really awkward for more than 2 dicts</span>
</span><span class='line'>
</span><span class='line'><span class="n">d</span> <span class="o">=</span> <span class="n">d1</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span class='line'><span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>I always wondered why one can&rsquo;t just add them up, but that&rsquo;s what we have. Anyway, this is also easy in funcy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="n">merge</span><span class="p">,</span> <span class="n">join</span>
</span><span class='line'><span class="n">merge</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="n">d2</span><span class="p">)</span>
</span><span class='line'><span class="n">merge</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="n">d2</span><span class="p">,</span> <span class="n">d3</span><span class="p">)</span>
</span><span class='line'><span class="n">join</span><span class="p">(</span><span class="n">sequence_of_dicts</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The best part here is these are omnivorous. They work with anything: sets, dicts, ordered dicts, lists, tuples, iterators, even strings, carefully preserving collection type.</p>

<p><em>3. Capturing something with regular expression. A usual way:</em></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">some_re</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</span><span class='line'><span class="k">if</span> <span class="n">m</span><span class="p">:</span>
</span><span class='line'>    <span class="n">actual_match</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">()</span> <span class="c"># or m.group(i) or m.groups()</span>
</span><span class='line'>    <span class="o">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much more straightforward with funcy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="n">re_find</span>
</span><span class='line'><span class="n">actual_match</span> <span class="o">=</span> <span class="n">re_find</span><span class="p">(</span><span class="n">some_re</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Still not impressed? Then look here:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="n">re_finder</span><span class="p">,</span> <span class="n">re_all</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">mapcat</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Get a number out of every word</span>
</span><span class='line'><span class="nb">map</span><span class="p">(</span><span class="n">re_finder</span><span class="p">(</span><span class="s">r&#39;\d+&#39;</span><span class="p">),</span> <span class="n">words</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Parse simple ini file into dict</span>
</span><span class='line'><span class="c"># (re_finder returns tuples when there is more that one capture in regexp)</span>
</span><span class='line'><span class="nb">dict</span><span class="p">(</span><span class="n">imap</span><span class="p">(</span><span class="n">re_finder</span><span class="p">(</span><span class="s">r&#39;(\w+)=(\w+)&#39;</span><span class="p">),</span> <span class="n">ini</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()))</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Find all numbers in all the strings and return as flat list</span>
</span><span class='line'><span class="n">mapcat</span><span class="p">(</span><span class="n">partial</span><span class="p">(</span><span class="n">re_all</span><span class="p">,</span> <span class="s">r&#39;\d+&#39;</span><span class="p">),</span> <span class="n">bunch_of_strings</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>About imports and practicality</h2>

<p>As you can see I import everything directly from funcy, not using any sub-packages. The reason it&rsquo;s designed this way is practicality. That would be too annoying to remember where each one tiny thing comes from. There are enough libraries to clutter your file heads anyway.</p>

<p>This also enables you to write:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">funcy</span> <span class="kn">import</span> <span class="o">*</span>
</span></code></pre></td></tr></table></div></figure>


<p>And start enjoying all functional python niceness right away. Ok, now when you know where all the stuff is kept I won&rsquo;t repeat imports in every new example.</p>

<h2>A bit more functional things</h2>

<p>We&rsquo;ve seen a pair of examples of higher order functions earlier, particularly <code>re_finder</code> and <code>partial</code>. One thing to note is that <code>re_finder</code> itself is a partial application of <code>re_find</code> meant to be used with <code>map</code> and friends. Naturally, there is a similar utility to be used with <code>filter</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Choose all private attributes of an object</span>
</span><span class='line'><span class="n">is_private</span> <span class="o">=</span> <span class="n">re_tester</span><span class="p">(</span><span class="s">&#39;^_&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nb">filter</span><span class="p">(</span><span class="n">is_private</span><span class="p">,</span> <span class="nb">dir</span><span class="p">(</span><span class="n">some_obj</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can create a bunch of predicates and filter with them:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">is_special</span> <span class="o">=</span> <span class="n">re_tester</span><span class="p">(</span><span class="s">&#39;^__.+__$&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">is_const</span> <span class="o">=</span> <span class="n">re_tester</span><span class="p">(</span><span class="s">&#39;^[A-Z_]+$&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nb">filter</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>But what if we want to apply several of them at once or use some predicate logic. That&rsquo;s easy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">is_public</span> <span class="o">=</span> <span class="n">complement</span><span class="p">(</span><span class="n">is_private</span><span class="p">)</span>
</span><span class='line'><span class="n">is_private_const</span> <span class="o">=</span> <span class="n">all_fn</span><span class="p">(</span><span class="n">is_private</span><span class="p">,</span> <span class="n">is_const</span><span class="p">)</span>
</span><span class='line'><span class="n">either_const_or_public</span> <span class="o">=</span> <span class="n">any_fn</span><span class="p">(</span><span class="n">is_const</span><span class="p">,</span> <span class="n">is_public</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or you can use convenience function complementary to <code>filter</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">remove</span><span class="p">(</span><span class="n">is_private</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span> <span class="c"># same as filter(is_public)</span>
</span></code></pre></td></tr></table></div></figure>


<p>I hope everyone have their functional appetite satisfied so we can switch to something less abstract.</p>

<h2>Collections</h2>

<p>Aside from <a href="http://funcy.readthedocs.org/en/latest/seqs.html">sequence utilities</a>, funcy provides lots of ones to work with collections.
And the two fundamental are <code>walk</code> and <code>select</code>, a versions of <code>map</code> and <code>filter</code> preserving collection type:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">walk</span><span class="p">(</span><span class="n">inc</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">})</span> <span class="c"># -&gt; {2, 3, 4}</span>
</span><span class='line'><span class="n">walk</span><span class="p">(</span><span class="n">inc</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span> <span class="c"># -&gt; (2, 3, 4)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Mapping function receives pairs when walking dicts</span>
</span><span class='line'><span class="n">swap</span> <span class="o">=</span> <span class="k">lambda</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
</span><span class='line'><span class="n">walk</span><span class="p">(</span><span class="n">swap</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="mi">20</span><span class="p">})</span>
</span><span class='line'><span class="c"># -&gt; {10: 1, 20: 2}</span>
</span><span class='line'>
</span><span class='line'><span class="n">select</span><span class="p">(</span><span class="n">even</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">})</span>
</span><span class='line'><span class="c"># -&gt; {2, 10, 20}</span>
</span><span class='line'>
</span><span class='line'><span class="n">select</span><span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span> <span class="n">k</span> <span class="o">==</span> <span class="n">v</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="mi">3</span><span class="p">})</span>
</span><span class='line'><span class="c"># -&gt; {1: 1}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This pair of functions is backed up with a set of ones to work with dicts: <code>walk_keys</code>, <code>walk_values</code>, <code>select_keys</code>, <code>select_values</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Get a dict of public attributes of an instance</span>
</span><span class='line'><span class="n">select_keys</span><span class="p">(</span><span class="n">is_public</span><span class="p">,</span> <span class="n">instance</span><span class="o">.</span><span class="n">__dict__</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Clean dict of falsy values</span>
</span><span class='line'><span class="n">select_values</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">some_dict</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last example in this section will include several new functions at once: <code>silent</code> &ndash; catches all exceptions in passed function, returning <code>None</code>; <code>compact</code> &ndash; removes falsy values from collection; <code>walk_values</code> &ndash; maps dict values with given function. Anyhow, this line constructs a dict of integer params from typical stringy request dict you get:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">compact</span><span class="p">(</span><span class="n">walk_values</span><span class="p">(</span><span class="n">silent</span><span class="p">(</span><span class="nb">int</span><span class="p">),</span> <span class="n">request_dict</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Back to data manipulation</h2>

<p>Finally, the interesting part. I included some examples here just because they seem cool. Although, I did this earlier to be honest. Anyway, let&rsquo;s split and group:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># split absolute and relative urls</span>
</span><span class='line'><span class="n">absolute</span><span class="p">,</span> <span class="n">relative</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">re_tester</span><span class="p">(</span><span class="s">r&#39;^http://&#39;</span><span class="p">),</span> <span class="n">urls</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># group posts by category</span>
</span><span class='line'><span class="n">group_by</span><span class="p">(</span><span class="k">lambda</span> <span class="n">post</span><span class="p">:</span> <span class="n">post</span><span class="o">.</span><span class="n">category</span><span class="p">,</span> <span class="n">posts</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Partition and chunk:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># make a dict from flat list of pairs</span>
</span><span class='line'><span class="nb">dict</span><span class="p">(</span><span class="n">partition</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">flat_list_of_pairs</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="c"># make a structures from flat list</span>
</span><span class='line'><span class="p">{</span><span class="nb">id</span><span class="p">:</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> <span class="k">for</span> <span class="nb">id</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">password</span> <span class="ow">in</span> <span class="n">partition</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">users</span><span class="p">)}</span>
</span><span class='line'>
</span><span class='line'><span class="c"># check versions are consecutive</span>
</span><span class='line'><span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">prev</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="nb">next</span> <span class="k">for</span> <span class="n">prev</span><span class="p">,</span> <span class="nb">next</span> <span class="ow">in</span> <span class="n">partition</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">versions</span><span class="p">)):</span>
</span><span class='line'>
</span><span class='line'><span class="c"># process data by chunks</span>
</span><span class='line'><span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">chunks</span><span class="p">(</span><span class="n">CHUNK_SIZE</span><span class="p">,</span> <span class="n">lots_of_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">process</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And a couple more, just for fun:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># add new line indents at the beginning of each paragraph</span>
</span><span class='line'><span class="k">for</span> <span class="n">line</span><span class="p">,</span> <span class="n">prev</span> <span class="ow">in</span> <span class="n">with_prev</span><span class="p">(</span><span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()):</span>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="n">prev</span><span class="p">:</span>
</span><span class='line'>        <span class="k">print</span> <span class="s">&#39;    &#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="k">print</span> <span class="n">line</span>
</span><span class='line'>
</span><span class='line'><span class="c"># select Shakespeare&#39;s play written in 1611</span>
</span><span class='line'><span class="n">where</span><span class="p">(</span><span class="n">plays</span><span class="p">,</span> <span class="n">author</span><span class="o">=</span><span class="s">&quot;Shakespeare&quot;</span><span class="p">,</span> <span class="n">year</span><span class="o">=</span><span class="mi">1611</span><span class="p">)</span>
</span><span class='line'><span class="c"># =&gt; [{&quot;title&quot;: &quot;Cymbeline&quot;, &quot;author&quot;: &quot;Shakespeare&quot;, &quot;year&quot;: 1611},</span>
</span><span class='line'><span class="c">#     {&quot;title&quot;: &quot;The Tempest&quot;, &quot;author&quot;: &quot;Shakespeare&quot;, &quot;year&quot;: 1611}]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>More than just a library</h2>

<p>Maybe some of you recognized some functions from Clojure or Underscore.js (Shakespear example was shamelessly ripped of the docs of the latter, for example). That should not surprise you, in many respects I drew inspiration from these two sources. Nonetheless I followed python spirit and stayed practical as far as I could.</p>

<p>And one more thought. We used to call programming languages languages, still rarely think of keywords and functions as words. We define our own words by writing new functions, but they are usually too specific to make it into our everyday use. Funcy utilities are designed the other way around, to be broadly used as a layer over python and it&rsquo;s standard library.</p>

<p>So, how about <a href="https://github.com/Suor/funcy">extending your vocabulary</a>?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Abstracting Control Flow]]></title>
    <link href="http://suor.github.io/blog/2013/10/08/abstracting-control-flow/"/>
    <updated>2013-10-08T12:13:00+08:00</updated>
    <id>http://suor.github.io/blog/2013/10/08/abstracting-control-flow</id>
    <content type="html"><![CDATA[<p>Any programmer, even if she doesn&rsquo;t see it this way, constantly creates abstractions. The most common things we abstract are calculations (caught into functions) or behavior (procedures and classes), but there are other recurring patterns in our work, especially in error handling, resource management and optimizations.</p>

<p>Those recurring patterns usually involve rules like &ldquo;close everything you open&rdquo;, &ldquo;free resources then pass error farther&rdquo;, &ldquo;if that succeeded go on else &hellip;&rdquo;, which commonly look like repetitive <code>if ... else</code> or <code>try ... catch</code> code. How about abstracting all that control flow?</p>

<p> <!--more--></p>

<p>In conventional code, where nobody plays too smart, control structures do control flow. Sometimes they don&rsquo;t do that well and then we throw in our own. That is simple in Lisp, Ruby or Perl, but is also possible in a way in any language featuring higher order functions.</p>

<h2>Abstractions</h2>

<p>Let&rsquo;s start from the beginning. What do we do to build a new abstraction?</p>

<ol>
<li>Select a piece of functionality or behavior.</li>
<li>Name it.</li>
<li>Implement it.</li>
<li>Hide our implementation behind chosen name.</li>
</ol>


<p>Points 3-4 are not always possible. It depends very much on flexibility of your language and the piece you are trying to abstract.</p>

<p>In case your language can&rsquo;t handle it, skip implementation and just describe your technique, make it popular, giving birth to a new design pattern. This way you can continue writing repetitive code without feeling bad about it.</p>

<h2>Back to real-life</h2>

<p>This is a piece of common python code, taken from real-life project with minimal changes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">urls</span> <span class="o">=</span> <span class="o">...</span>
</span><span class='line'><span class="n">photos</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">):</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="n">photos</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">download_image</span><span class="p">(</span><span class="n">url</span><span class="p">))</span>
</span><span class='line'>            <span class="k">break</span>
</span><span class='line'>        <span class="k">except</span> <span class="n">ImageTooSmall</span><span class="p">:</span>
</span><span class='line'>            <span class="k">pass</span> <span class="c"># skip small images</span>
</span><span class='line'>        <span class="k">except</span> <span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">URLError</span><span class="p">,</span> <span class="n">httplib</span><span class="o">.</span><span class="n">BadStatusLine</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">),</span> <span class="n">e</span><span class="p">:</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">DOWNLOAD_TRIES</span><span class="p">:</span>
</span><span class='line'>                <span class="k">raise</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are many aspects to this code: iterating over <code>urls</code>, downloading images, collecting images into <code>photos</code>, skipping small images and retries in case of download errors. All of them are entangled in this single piece of code, despite that they can be useful outside of this code snippet.</p>

<p>And some of them already exist separately. For example, iteration plus result gathering make <code>map</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">photos</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">download_image</span><span class="p">,</span> <span class="n">urls</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s try fishing out other aspects, starting with skipping small images. That could be done like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@contextmanager</span>
</span><span class='line'><span class="k">def</span> <span class="nf">ignore</span><span class="p">(</span><span class="n">error</span><span class="p">):</span>
</span><span class='line'>    <span class="k">try</span><span class="p">:</span>
</span><span class='line'>        <span class="k">yield</span>
</span><span class='line'>    <span class="k">except</span> <span class="n">error</span><span class="p">:</span>
</span><span class='line'>        <span class="k">pass</span>
</span><span class='line'>
</span><span class='line'><span class="n">photos</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'><span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
</span><span class='line'>    <span class="k">with</span> <span class="n">ignore</span><span class="p">(</span><span class="n">ImageTooSmall</span><span class="p">):</span>
</span><span class='line'>        <span class="n">photos</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">download_image</span><span class="p">(</span><span class="n">url</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looks good. However this can&rsquo;t be composed with <code>map</code> easily. But let&rsquo;s put it off for now and deal with network errors. We can try abstracting it the same way we handled <code>ignore</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">with</span> <span class="n">retry</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">,</span> <span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">URLError</span><span class="p">,</span> <span class="n">httplib</span><span class="o">.</span><span class="n">BadStatusLine</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">)):</span>
</span><span class='line'>    <span class="c"># ... do stuff</span>
</span></code></pre></td></tr></table></div></figure>


<p>Only that can&rsquo;t be implemented. Python <code>with</code> statement can&rsquo;t run its block more than once. We just ran against language constraint. It&rsquo;s important to notice such cases if you want to understand languages differences beyond syntax. In Ruby and to lesser extend in Perl we could continue manipulating blocks, in Lisp we could even manipulate code (that would probably be an overkill), but not all is lost for Python, we should just switch to higher order functions and their convenience concept &ndash; decorators:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">retry</span><span class="p">(</span><span class="n">call</span><span class="p">,</span> <span class="n">tries</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="ne">Exception</span><span class="p">):</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">tries</span><span class="p">):</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">call</span><span class="p">()</span>
</span><span class='line'>        <span class="k">except</span> <span class="n">errors</span><span class="p">:</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">tries</span><span class="p">:</span>
</span><span class='line'>                <span class="k">raise</span>
</span><span class='line'>
</span><span class='line'><span class="n">http_retry</span> <span class="o">=</span> <span class="n">retry</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">,</span> <span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">URLError</span><span class="p">,</span> <span class="n">httplib</span><span class="o">.</span><span class="n">BadStatusLine</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">))</span>
</span><span class='line'><span class="n">photos</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">http_retry</span><span class="p">(</span><span class="n">download_image</span><span class="p">),</span> <span class="n">urls</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we can see, it even works with <code>map</code> naturally. And more than that, we got a pair of potentially reusable tools: <code>retry</code> and <code>http_retry</code>. Unfortunately our <code>ignore</code> context manager can&rsquo;t be easily added here. It&rsquo;s not composable. Let&rsquo;s just rewrite it as decorator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">ignore</span><span class="p">(</span><span class="n">call</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="ne">Exception</span><span class="p">):</span>
</span><span class='line'>    <span class="k">try</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">call</span><span class="p">()</span>
</span><span class='line'>    <span class="k">except</span> <span class="n">errors</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">None</span>
</span><span class='line'>
</span><span class='line'><span class="n">ignore_small</span> <span class="o">=</span> <span class="n">ignore</span><span class="p">(</span><span class="n">ImageTooSmall</span><span class="p">)</span>
</span><span class='line'><span class="n">http_retry</span> <span class="o">=</span> <span class="n">retry</span><span class="p">(</span><span class="n">DOWNLOAD_TRIES</span><span class="p">,</span> <span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">URLError</span><span class="p">,</span> <span class="n">httplib</span><span class="o">.</span><span class="n">BadStatusLine</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">))</span>
</span><span class='line'><span class="n">download</span> <span class="o">=</span> <span class="n">http_retry</span><span class="p">(</span><span class="n">ignore_small</span><span class="p">(</span><span class="n">download_image</span><span class="p">))</span>
</span><span class='line'><span class="n">photos</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="n">download</span><span class="p">,</span> <span class="n">urls</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<h2>How is this better?</h2>

<p>Seems like we have more code now and it still involves all the same aspects. The difference is that they are not entangled anymore they are composed. Which means several things:</p>

<ul>
<li>every single aspect is visible,</li>
<li>it&rsquo;s named,</li>
<li>it can be taken out and brought back easily,</li>
<li>it can be reused.</li>
</ul>


<p>The essential code takes only 4 last lines and after getting used to functional control flow can probably become more readable. Or not, that&rsquo;s subjective. Still I hope this post will help somebody to write better code.</p>

<p><strong>P.S.</strong> I packed <code>@decorator</code>, <code>ignore</code> and <code>retry</code> into <a href="https://github.com/Suor/funcy">one practical library</a>.</p>

<p><strong>P.P.S.</strong> Other examples of control flow abstractions include: <a href="http://underscorejs.org/#functions">function manipulations in underscore.js</a>, list comprehensions and generator expressions, <a href="https://github.com/Suor/patterns">pattern matching</a>, <a href="https://github.com/Suor/overload">function overload</a>, caching decorators and much more.</p>
]]></content>
  </entry>
  
</feed>
