<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Mon, May 23, 2016 at 3:58 PM Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, May 23, 2016 at 11:45 AM, Joao S. O. Bueno<br>
<<a href="mailto:jsbueno@python.org.br" target="_blank">jsbueno@python.org.br</a>> wrote:<br>
> I still fail to see what justifies violating The One Obvious Way to Do It which uses an if/elif sequence<br>
<br>
Honestly I'm not at all convinced either! If it was easy to do all<br>
this with a sequence of if/elif clauses we wouldn't need it. The<br>
problem is that there are some types of matches that aren't so easy to<br>
write that way, e.g. combining an attempted tuple unpack with a guard,<br>
or "instance unpack" (check whether specific attributes exist)<br>
possibly combined with a guard. (The tricky thing is that the guard<br>
expression often needs to reference to the result of the unpacking.)<br></blockquote><div><br></div><div><span style="line-height:1.5">Wouldn't an exception-catching expression (</span><span style="line-height:1.5">PEP 463)</span><span style="line-height:1.5"> enable most of what you want with the existing if/elif/else chain?</span></div><div><br></div><div><div>    def demo(arg):</div><div>        if ((arg.x, arg.y) except AttributeError: False):</div><div>            print('x=', arg.x, 'y=', arg.y)</div><div>        elif ((arg[0], arg[1]) except IndexError: False):</div><div>            a, b, *_ = arg</div><div>            print('a=', a, 'b=', b)</div><div>        else:</div><div>            print('Too bad')</div></div><div><br></div><div><br></div><div>To get everything you want, we could have an exception-catching assignment expression. While a plain ``=`` assignment would be problematic as an expression due to the common ``==`` typographical error, a less error-prone operator might be OK. I'd suggested ``?=`` earlier in the thread, but perhaps I didn't write out a good example at that time. Here's one that's closer to the original demo example.</div><div><br></div><div><div>    def demo(arg):</div><div>        if p, q ?= arg.x, arg.y: <span style="line-height:1.5">print('x=', p, 'y=', q)</span></div><div>        elif a, b, *_ ?= arg: <span style="line-height:1.5">print('a=', a, 'b=', b)</span></div><div>        else: <span style="line-height:1.5">print('Too bad')</span></div></div><div><br></div><div><br></div><div>I figure it's better to solve the category of problems -- exception-catching expressions -- rather than the single problem of catching exceptions in an if/elif/else chain. Or do you think this is t<span style="line-height:1.5">oo much temptation for unreadable code golf?</span></div></div></div>