Rob Cliffe via Python-ideas writes:
Steven d'Aprano wrote:
You don't have to agree with Serhiy's preference to recognise that there are cases where this proposal will save no lines of code. And probably not rare cases -- I expect that they will be much more common than the short examples you quote:
If you read the PEP you will find plenty of short examples:
process(dic[key] except KeyError: None) value = (lst[2] except IndexError: "No value") cond = (args[1] except IndexError: None) pwd = (os.getcwd() except OSError: None) e.widget = (self._nametowidget(W) except KeyError: W) line = (readline() except StopIteration: '') etc. The first is a poor example because that can so easily be written as:
process(dic.get(key))
I disagree with Steven here to the extent that one purpose of the PEP is to provide a common idiom that allows us to express this *without* proliferating methods like dict.get. I hope he will unpack this by arguing "d.get(k)" is *better* than "(d[k] except KeyError: None)". Given my present understanding of the situation, I would be perfectly happy with an outcome where methods like dict.get were deprecated (as a matter of style and TOOWTDI, I don't mean DeprecationWarning) in favor of the uniform except-clause syntax, unless there's a reason this syntax is *bad*. There are many times I choose to split a long if-else expression across lines, and others where I choose the statement form, and of course I use "x or default" instead of "x if x else default". I see no reason why this construct wouldn't "work" the same way, although it might be much less common (then again, it might be *more* common than if-else expressions). The kind of anti-except-expression argument I have in mind can be exemplified using the fourth example: pwd = (os.getcwd() except OSError: None) where I would find the argument that this really is an environmental condition that probably shouldn't be papered over with "pwd=None" in almost all contexts, and therefore should be emphasized with a try *statement*, pretty plausible. But that might be a style argument ("use 'try', not 'except' expressions when the Error indicates a broken environment rather than an uncommon but reasonable state"), rather than an argument that we *should not* unify these usages with a single idiom. Interestingly, Steven takes the opposite position:
The fourth example of os.getcwd is excellent.
I just don't know. "Infinite are the arguments of mages." ;-) Steve