<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Apr 7, 2015 at 3:59 PM, Andrew Barnert <span dir="ltr"><<a href="mailto:abarnert@yahoo.com.dmarc.invalid" target="_blank">abarnert@yahoo.com.dmarc.invalid</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div id=":1ew" class="" style="overflow:hidden">The mapping is an interesting end-run around the decomposition problem, but it seems like it throws away the type of the object. In other words, Point(x, y) and Vector(x, y) both pattern-match identically to either {'x': x, 'y': y}. In ML or Haskell, distinguishing between the two is one of the key uses of pattern matching.<br>
<br>
And another key use is distinguishing Point(0, y), Point(x, 0) and Point(x, y), which it looks like you also can't do this way; the only way to get x bound in the case block (assuming Point, like most classes, isn't iterable and therefore can't be decomposed as a tuple) is to match a dict.</div></blockquote></div><br><div class="gmail_extra" style="font-size:12.8000001907349px">Wouldn't it be better to be explicit about the type matching? For example, using pypatt, I've done this:</div><div class="gmail_extra" style="font-size:12.8000001907349px"><br></div><div class="gmail_extra" style="font-size:12.8000001907349px"><div class="gmail_extra"><font face="monospace, monospace">In [19]: import pypatt</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [20]: Point = namedtuple('Point', 'x y')</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [21]: @pypatt.transform</font></div><div class="gmail_extra"><font face="monospace, monospace">def origin_distance(point):</font></div><div class="gmail_extra"><font face="monospace, monospace">    with match((type(point), point)):</font></div><div class="gmail_extra"><font face="monospace, monospace">        with (Point, (0, quote(y))):</font></div><div class="gmail_extra"><font face="monospace, monospace">            return y</font></div><div class="gmail_extra"><font face="monospace, monospace">        with (Point, (quote(x), 0)):</font></div><div class="gmail_extra"><font face="monospace, monospace">            return x</font></div><div class="gmail_extra"><font face="monospace, monospace">        with (Point, (quote(x), quote(y))):</font></div><div class="gmail_extra"><font face="monospace, monospace">            return (x ** 2 + y ** 2) ** 0.5</font></div><div class="gmail_extra"><font face="monospace, monospace">   ....:         </font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [22]: origin_distance(Point(0, 5))</font></div><div class="gmail_extra"><font face="monospace, monospace">Out[22]: 5</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [23]: origin_distance(Point(10, 0))</font></div><div class="gmail_extra"><font face="monospace, monospace">Out[23]: 10</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [24]: origin_distance(Point(3, 4))</font></div><div class="gmail_extra"><font face="monospace, monospace">Out[24]: 5.0</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [25]: origin_distance(Point(0, 'far'))</font></div><div class="gmail_extra"><font face="monospace, monospace">Out[25]: 'far'</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">In [26]: origin_distance(Point('near', 0))</font></div><div class="gmail_extra"><font face="monospace, monospace">Out[26]: 'near'</font></div><div><br></div><div><a href="https://pypi.python.org/pypi/pypatt/" target="_blank">https://pypi.python.org/pypi/pypatt/</a></div><div><br></div><div>Grant</div></div></div></div>