[Python-Dev] More Switch: Explicit freezing
Talin
talin at acm.org
Sat Jul 1 22:32:02 CEST 2006
Here's another stab at the "explicit freezing" school of thought on the
switch semantics. The idea is to borrow the freeze protocol and apply it
to functions.
In this scheme, the default behavior of switch is to rebuild the
dictionary each time the switch is executed. However, by calling
freeze(), you can get a 'frozen' version of the function in which all
switch dictionaries contained within the function are precalculated:
# Emulating 'freeze at function definition time'
def myfunc( x ):
switch y:
case a:
...
case b:
...
myfunc = freeze( myfunc )
This of course lends itself well to decorator syntax:
@freeze
def myfunc( x ):
switch y:
case a:
...
case b:
...
You can also get 'freeze on first use' via the appropriate decorator
function, although that's a litte harder to white (essentially, you need
a way to test if the function is already frozen.)
Each time you call freeze(), you get a new copy of the function object
with the switch dictionaries bound to the values that were in the scope
of the call to 'freeze'. This means that you can call freeze several
times and get several different versions of the function:
def myfunc( x ):
switch y:
case a:
...
case b:
...
a = 1
b = 2
f1 = freeze( myfunc )
a = 3
b = 4
f2 = freeze( myfunc )
Now we have two versions of the function, each having a different switch
dictionary.
Note that 'switch' is still usable without 'freeze', it just won't run
as fast. This means that the folks who are interested in a switch
statement purely for its improved expressiveness can simply not bother
with freezing the function.
-- Talin
More information about the Python-Dev
mailing list