[Python-Dev] Switch statement

Fredrik Lundh fredrik at pythonware.com
Fri Jun 23 10:01:34 CEST 2006


Guido van Rossum wrote:
> That sounds like a good solution all around. I hope that others can
> also find themselves in this.
>> (1) An expression of the form 'static' <atom> has the semantics of
> evaluating the atom at the same time as the nearest surrounding
> function definition. If there is no surrounding function definition,
> 'static' is a no-op and the expression is evaluated every time.
> [Alternative 1: this is an error] [Alternative 2: it is evaluated
> before the module is entered; this would imply it can not involve any
> imported names but it can involve builtins] [Alternative 3:
> precomputed the first time the switch is entered]

+0.5 on this (still looking for some obvious drawback).
as for static in non-local scopes, an error feels more pythonic, but 
that would complicate things if you want to move code from a local to a 
global context (but how often do you do that ?). alternative 2 and 3 
feels "too magic", again.
> (2) All case expressions in a switch have an implied 'static'.

I'm still -0 on implied static. and only +0 on switch/case, in general. 
 but it's growing on me.
(now, if you're written "implied 'break'", I'm all for it)
> (3) A switch is implemented using a dict which is precomputed at the
> same time its static expressions are precomputed. The switch
> expression must be hashable. Overlap between different cases will
> raise an exception at precomputation time.

+0 on switch/case, but -0.5 on a "in terms of implementation" rather 
than "in terms of existing language constructs" approach.
as I mentioned before, I'd prefer if the switch/case/case-in/else was 
defined in terms of a corresponding if/elif/else construct (but where 
the controlling expression is only evaluated once).
after all, Python's a dynamic language, and I'm not convinced that I 
would never want to use dynamically evaluated case values. just map
 switch EXPR:
 case E1:
 ...
 case in E2:
 ...
 else:
 ...
to
 VAR = EXPR
 if VAR == E1:
 ...
 elif VAR in E2:
 ...
 else:
 ...
where VAR is a temporary variable, and case and case-in clauses can be 
freely mixed, and leave the rest to the code generator. (we could even 
allow "switch EXPR [as VAR]" to match a certain other sugar construct).
I'm also a K&R guy, so switch/case/case-in/else should all have the same 
indent. anything else is just sloppy design.
> Independent from this, I wonder if we also need static names of the form
>> static <name> = <expression>
>> which would be similar to
>> <name> = static (<expression>)
>> but also prevents <name> from being assigned to elsewhere in the same scope.

-0 from here; I don't see an obvious need for static names, but it may 
grow on me.
> Also, I haven't heard a lot of thumbs up or down on the idea of using
>> case X:
>> to indicate a single value and
>> case in S:
>> to indicate a sequence of values.

+1 from here. it's obvious, useful, and therefore perfectly pythonic.
</F>


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /