[Python-Dev] Switch statement

M.-A. Lemburg mal at egenix.com
Thu Jun 22 20:54:18 CEST 2006

Guido van Rossum wrote:
> Without const declarations none of this can work and
> the "at-function-definition-time" freezing is the best, because most
> predictable, approach IMO.

I you like this approach best, then how about using the same
approach as we have for function default argument values:

Variables which are to be regarded as constant within the
scope of the function are declared as such by using a "const"
declaration (much like we already have with the
global declaration).

a,b,c,d = range(4)
defvalue = 1

def switch(x=defvalue):
    const a,b,c,d
    switch x:
        case a: return 'foo'
        case b: return 'foo'
        case c: return 'foo'
        case d: return 'foo'
        else: raise ValueError(x)

This declaration would cause the compiler to generate
LOAD_NAME opcodes just like for defvalue which then gets
executed at code object execution time, ie. when the
function is created.

This would also work out for the solution 1 case
in the PEP (if-elif-else)... <hint><hint> :-)

def switch(x=defvalue):
    const a,b,c,d
    if x == a: return 'foo'
    elif x == b: return 'bar'
    elif x == c: return 'baz'
    elif x == d: return 'bazbar'
    else: raise ValueError(x)

Furthermore, the compiler could protect the constant
names from assignments (much in the same way it
applies special treatment to variables declared global
in a scope).

A nice side-effect would be that could easily use the
same approach to replace the often used default-argument-hack,

def fraction(x, int=int, float=float):
    return float(x) - int(x)

This would then read:

def fraction(x):
    const int, float
    return float(x) - int(x)

Marc-Andre Lemburg

Professional Python Services directly from the Source  (#1, Jun 22 2006)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
2006-07-03: EuroPython 2006, CERN, Switzerland              10 days left

::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::

More information about the Python-Dev mailing list