On Sun, Apr 14, 2013 at 4:24 AM, Peter Norvig <peter@norvig.com> wrote:
Beginners will often write code like this:
if val > 0: return +1 elif val < 0: return -1 elif val == 0: return 0
Now if you did this in Java, the compiler would produce an error saying that there is an execution path that does not return a value. Python does not give an error message, but it would be considered more idiomatic (and slightly more efficient) to have just "else:" in the third clause.
Here's an idea to address this. What do you think of the syntax
"else" expression ":"
for example:
if val > 0: return +1 elif val < 0: return -1 else val == 0: return 0
with the interpretation:
if val > 0: return +1 elif val < 0: return -1 else: assert val == 0 return 0
I have to say, I'm uncertain. I'm not sure this is even a good idea at all, and I'm not sure if it should translate into "assert expression" or whether it should be "if not expression: raise ValueError". What do you think?
I think the difference between: if val > 0: return +1 elif val < 0: return -1 else val == 0: return 0 and: if val > 0: return +1 elif val < 0: return -1 elif val == 0: return 0 is far too subtle to be helpful. If an if/elif chain is expected to be exhaustive and you want to ensure it remains that way during ongoing maintenance, you can already do: if val > 0: return +1 elif val < 0: return -1 elif val == 0: return 0 else: raise RuntimeError("Unhandled input: {!r:100}".format(val)) (with the "else:" being optional if this is the last statement in a function) In general, though, Python already decided on its answer to this question by always allowing a final "return None" to be implicit, even when there are explicit return statements elsewhere in the function. Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia