This last point. It would make it impossible for Python to treat the
switch statement as anything but an alternate form of chained if-else.
There are a couple nice things about a switch () statement:
1) It guarantees that 'expr' is evaluated exactly once. If you want
that with a chained if/else you have to create a temporary variable.
2) It guarantees that exactly one path is chosen (assuming we're not
going to duplicate C's "fall through" mistake).
The result is that it makes the author's intention instantly clear to
the reader: we're going to evaluate some expression _exactly_once_ and
then select _exactly_one_ of several paths based on that value. Sure,
you can do the same thing with a chained if/elif/else, but it requires
some effort for the reader to figure that out. Accidently type "if"
instead of "elif" two thirds of the way down, and you get something
that works right _most_ of the time, but not always. [Not that _I've_
ever done that and then read through the whole thing six times over a
period of two days before noticing it.]
<reductio ad absurdum>
If the availability of an alternate but computationally equivalent
representation was a valid argument against a language feature, then
we ought to toss out Python entirely: It's always possible to write
the exact same algorithm, so why bother with Python?
A dict optimization wouldn't actually optimize anything because it
would have to be constructed every time the statement is executed.
I don't think question should be "how does this help the compiler?"
The question should be "how does this help the _user_ of the compiler?
The user of the compiler spends more time reading code than anything
else. Something that makes code easier to read is therefore worth
considering. A switch statement is easier to read than a chained
if/else. IMO, _that's_ the proper argument for a switch statement.
Trying to justify a switch statement as a way to help generate more
efficient code seems silly: This is not 1970 -- any decent compiler
should be able to generate the same code for a switch statement and
for an equivalent chained if/else.