On 19/02/2014 10:46, Rob Cliffe wrote:

On 19/02/2014 08:23, Bruce Leban wrote:

On Tue, Feb 18, 2014 at 11:06 PM, Chris Angelico <rosuav@gmail.com> wrote:
However, I'm removing two parts of the proposal: ... chaining of
excepts (use parens, "(expr except Exception1: default1) except
Exception2: default2").

There are two problems with trying to leave this out.

First, you say "use parens" but no use of parenthesis can have the same effect. The alternative you give:
    (expr except E1: default1) except E2: default2 
is not the same as the chained form. This catches E2 in both the evaluation of E1 and the evaluation of default1 while the chained form catches both exceptions only in the evaluation of E1. And putting parens anywhere else doesn't do it either.

Second, isn't an except expression like any other expression which can be used anywhere an expression can be? So that means that writing something that looks like a chained expression without parenthesis will be a valid expression and will have to have some interpretation (depending on whether except is left associative or right associative.
+1.
I now see that the semantics of

expr1 except E1: (default1 except E2: default2)

and

(expr1 except E1: default1) except E2: default2

are not the same (in an earlier post I thought they were).

And neither of them are the same as:

Evaluate expr1 and see what exception it raises:
    If it raises E1, return default1
    If it raises E2, return default2.

(To spell it out, as much for my own benefit as anything else:
    The first catches E2 in the evaluation of default1.
    The second catches E2 in the evaluation of expr1 OR default1.
    The last catches E2 in the evaluation of expr1 only.
)
I suggest the form without brackets should (be legal and) mean the last of these, because
    (1) It feels to me like the natural meaning
    (2) It can't conveniently be expressed otherwise without introducing additional syntax.

Rob Cliffe
Also (3) When assigned to a variable it is equivalent to
try:
    var = expr1
except E1:
    var = default1
except E2:
    var = default2


Given that, I think it is better to define it as chained now rather than leaving people to think it's chained and never being able to add it in the future (since that will change the semantics of existing code). This is analogous to handling a < b < c: it's a bug magnet in C for inexperienced programmers but can't be changed without breaking code. Starting from scratch in Python, it could be chained.

--- Bruce
Learn how hackers think: http://j.mp/gruyere-security


_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


No virus found in this message.
Checked by AVG - www.avg.com
Version: 2012.0.2247 / Virus Database: 3705/6606 - Release Date: 02/19/14




_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


No virus found in this message.
Checked by AVG - www.avg.com
Version: 2012.0.2247 / Virus Database: 3705/6606 - Release Date: 02/19/14