<div><div><br></div></div><div class="gmail_quote">On Sat, Mar 2, 2013 at 2:45 PM, Alan Johnson <span dir="ltr"><<a href="mailto:alan@breakrs.com" target="_blank">alan@breakrs.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
        try with context_manager():<br>
                … bunch of code …<br>
        except:<br>
                … exception handler …</blockquote><div><br></div><div><br></div><div><font face="courier new, monospace">This optimization saves a colon and some white space and mixes two unrelated concepts.</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">The try/except pattern I want to optimize is</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    try:</font></div>

<div><font face="courier new, monospace">        x = expr1</font></div><div><font face="courier new, monospace">    except ValueError:</font></div><div><font face="courier new, monospace">        x = expr2</font></div><div>

<font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">For example:</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    expr1 except ValueError else expr2</font></div>

<div><font face="courier new, monospace">or</font></div><div><font face="courier new, monospace">    try expr1 except ValueError </font><span style="font-family:'courier new',monospace">else expr2</span></div><div>

<span style="font-family:'courier new',monospace"><br></span></div><div><span style="font-family:'courier new',monospace">This is particularly useful in cases like this:</span></div><div><br></div><div><font face="courier new, monospace">    a = ((try t.x except AttributeError else 0)</font></div>

<div><font face="courier new, monospace">         + </font><span style="font-family:'courier new',monospace">(try t.y except AttributeError else 0)</span></div><div><div><font face="courier new, monospace">         + </font><span style="font-family:'courier new',monospace">(try t.z except AttributeError else 0))</span></div>

</div><div><span style="font-family:'courier new',monospace"><br></span></div><div><span style="font-family:'courier new',monospace">where standard try/except requires 13 lines and is much harder to read.</span></div>

<div><span style="font-family:'courier new',monospace"><br></span></div><div><font face="courier new, monospace">Yes, this can be done with a function and two lambdas (and I've done it this way):</font></div>
<div>
<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    try_except(lambda: expr1, ValueError, lambda: expr2)</font></div><div><font face="courier new, monospace"><br></font></div>

<div><font face="courier new, monospace">    def try_except(value, exceptions, otherwise):</font></div><div><font face="courier new, monospace">        try:</font></div><div><font face="courier new, monospace">            return value()</font></div>

<div><font face="courier new, monospace">        except exceptions or Exception:</font></div><div><font face="courier new, monospace">            return otherwise()</font><span style="font-family:'courier new',monospace">    </span></div>

</div><div><br></div><div><font face="courier new, monospace">--- Bruce</font></div><div><font face="courier new, monospace">Learn how hackers think: <a href="http://j.mp/gruyere-security">http://j.mp/gruyere-security</a></font></div>

<div><br></div>