On 2014-04-22 18:39, Andrew Barnert wrote:
On Apr 22, 2014, at 8:01, "Lucas Malor" <email@example.com mailto:firstname.lastname@example.org> wrote:
On 20 April 2014 04:17, Bruce Leban bruce-at-leapyear.org http://bruce-at-leapyear.org |python-ideas-at-python.org http://python-ideas-at-python.org| <email@example.com mailto:firstname.lastname@example.org> wrote:
I found that the ugliest part of your proposal since it hides the first case and at the same time makes it appear special when it isn't.
Myabe yes, but if you "translate" it in an if-elif, also the if seems to be "special".
Yes, there is a difference, but it's not nearly as dramatic as with your version. The conditions still look roughly parallel, only one short word away from the indent point, instead of the first one being way off to the right.
On Apr 22, 2014, at 8:27, "Lucas Malor" <email@example.com mailto:firstname.lastname@example.org> wrote:
Sorry, I didn't read it carefully. Anyway, youe example can be written as:
for i in range(5): print(i, end=' => ') if i == 1: print('one') elif i == (2,3): print('tuple(two, three)') elif i in (2, 3): print('two or three') elif i > 3: print('more than three') else: print('unmatched')
and it's much simpler to read.
That's pretty much his point. The same can be said for all of your examples.
Your version is only "simpler" in that your "case" and "elcase" are spelled "if case" and "elif case" in his. Meanwhile, your version is more complex in that the first case is crammed on the same line with the "switch". Also, instead of automatically handling tuples in a natural and obvious way, you're forced to invent a new builtin class and a new display form just to distinguish tuples inline in a case label, and still can't easily handle the distinction in a natural and readable way. And, while his can be trivially extended to handle other types of comparison besides == and in, yours can't. So, you've come up with something that's more complex, less natural, and less powerful than what we can already do, and the only benefit is a little bit of brevity.
[snip] How about a slightly modified 'if' statement:
for i in range(5): print(i, end=' => ') case if i == 1: print('one') elif (2, 3): # Same as elif == (2, 3) print('tuple(two, three)') elif in (2, 3): print('two or three') elif > 3: print('more than three') elif is None: print('None') elif == 0: # Or just elif 0 print('zero') else: print('unmatched')
The 'case' says that you want to test the value of part preceding the comparator, in this case 'i'.
In the 'elif' conditions, '==' is assumed unless you say otherwise.