[Python-Dev] Switch statement
Guido van Rossum
guido at python.org
Wed Jun 21 07:14:51 CEST 2006
On 6/20/06, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 12:26 PM 6/21/2006 +1200, Greg Ewing wrote:
> >Guido van Rossum wrote:
> > > But it would be easy enough to define a dict-filling function that
> > > updates only new values.
> >Or evaluate the case expressions in reverse order.
> -1; stepping through the code in a debugger is going to be weird enough,
> what with the case statements being executed at function definition time,
> without the reverse order stuff.
> I'd rather make it an error to list the
> same value more than once; we can just check if the key is present before
> defining that value.
That makes sense too.
I was thinking of a use case where you'd have a couple of sets of
cases that need the same treatment per set (sre_compile.py has a few
of these) but one of the sets has an exception. With the if/elif style
you could write this as
if x is exception:
elif x in set1:
...case for set1...
elif x in set2:
..case for set2...
But the prospect of something like this passing without error:
case 1: ...case 1...
case 1: ...another case 1?!?!...
makes me think that it's better to simply reject overlapping cases.
BTW I think the several-sets use case above is important and would
like to have syntax for it.
Earlier it was proposed to allow saying
case 1, 2, 3: ...executed if x==1 or x==2 or x==3...
but now that we're agreed to evaluate the expression at function
definition time, I want to support
case S: ...executed if x in S...
but that would be ambiguous. So, thinking aloud, here are a few possibilities:
case A: ... if x == A...
cases S: ...if x in A...
or perhaps (saving a keyword):
case A: ... if x == A...
case in S: ...if x in A...
This would also let us write cases for ranges:
case in range(10): ...if x in range(10)...
I propose that the expression used for a single-value should not allow
commas, so that one is forced to write
case (1, 2): ...if x == (1, 2)...
if you really want a case to be a tuple value, but you should be able to write
case in 1, 2: ...if x in (1, 2)...
since this really doesn't pose the same kind of ambiguity. If you
forget the 'in' it's a syntax error.
Hm, so this still doesn't help if you write
case S: ...
(where S is an immutable set or sequence) when you meant
case in S: ...
so I'm not sure if it's worth the subtleties.
Time for bed here,
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-Dev