[Python-Dev] Switch statement

Phillip J. Eby pje at telecommunity.com
Thu Jun 22 21:59:33 CEST 2006

At 12:24 PM 6/22/2006 -0700, Guido van Rossum wrote:
>OK, I think I see how this works. You pre-compute the expression at
>def-time, squirrel it away in a hidden field on the function object,
>and assign it to a local each time the statement is executed.

More precisely, I'd say that the computation is moved to function 
definition time and becomes an anonymous free variable.  The body of the 
static expression becomes a LOAD_DEREF of the free variable, rather than 
computation of the expression.

The debug trace will show the function definition going to the lines that 
contain the static expressions, but that's understandable.

I think I like it.  I was confused by what Fredrik meant by "const", but 
your renaming it to "static" makes more sense to me; i.e. it belongs to the 
function, as opposed to each execution of the function.  (Whereas I was 
reading "const" as meaning "immutable" or "non-rebindable", which made no 
sense in the context.)

>Unfortunately this would probably cause people to write
>   switch x:
>     case static re.DOTALL: ...
>     case static re.IGNORECASE: ...
>which is just more work to get the same effect as the
>def-time-switch-freezing proposal.

Without the "static", the reordering of execution isn't obvious.  But 
perhaps that could be lived with, if the explanation was, "well, static is 
implied by case".

>I'm also unclear on what you propose this would do *without* the
>statics. Would it be a compile-time error? Compile the dict each time
>the switch is executed? Degenerate to an if/elif chain? Then what if x
>is unhashable? What if *some* cases are static and others aren't?

If we allow non-static cases, then they should become "if"s that happen 
prior to a dictionary lookup on the remaining static/literal ones.  Or we 
could just say that each adjacent block of static cases is its own 
dictionary lookup, and the rest happen in definition order.  (i.e., you 
replace contiguous static/literal runs with dictionary lookups, and 
everything else is if-elif.)

More information about the Python-Dev mailing list