[Python-Dev] switch in Python.

M.-A. Lemburg mal@lemburg.com
Tue, 13 Nov 2001 10:45:19 +0100


Thomas Wouters wrote:
> 
> I uploaded a proof-of-concept of the switch statement to SourceForge:
> 
> https://sourceforge.net/tracker/index.php?func=detail&aid=481118&group_id=5470&atid=305470
> 
> It's a diff against the current CVS tree, taken from 'src/' -- so apply in
> src/ with -p0.

Cool. I'll add the pointer to the PEP 275.
 
> It's a quick and almost certainly buggy hack. It bypasses the c_consts_dict
> in an ugly way, and might break code that tries to do stuff with code
> objects. It probably doesn't keep track of the stack properly, and skips
> SET_LINENO opcodes. It only allows string or numerical literals, though it
> does get the '1000 == 1000.0 == 1000L' trick for free. It doesn't contain
> changes to docs or dis.py, and it doesn't use a future statement. It _does_
> contain a change to distutils, because it uses a variable 'switch' :-) And I
> haven't profiled it in any way. In my defense, I don't recall writing it, so
> I was probably sleeping at the time (or at least I should have been.)

One question: What happens if the implementation finds that x is
not hashable ?
 
> Anyway, here's how it works:
> 
> """
> def whatis(x):
>     switch x:
>         case "number one":
>             return "The Larch."
>         case "spam", "Spam", "SPAM":
>             return "It's " + "SPAM "*31
>         case 1.1:
>             return "one dot one"
>         case 1000L:
>             return "a lot."
>         case 1j:
>             return "Not *really* there."
>     else:
>         return "D'oh, donno that!"
> 
> for val in (1j, "number one", 1.1, 1000, 1000L, 1000.0, 1000.0005,
>         "SPAM", "spam", "spaM", "eggs and ham"):
>     print "What is", repr(val), "?"
>     print whatis(val)
>     print
> """
> 
> thomas@stalker:~/python-cvs/dist/src$ ./python example.py
> 
> What is 1j ?
> Not *really* there.
> 
> What is 'number one' ?
> The Larch.
> 
> What is 1.1000000000000001 ?
> one dot one
> 
> What is 1000 ?
> a lot.
> 
> What is 1000L ?
> a lot.
> 
> What is 1000.0 ?
> a lot.
> 
> What is 1000.0005 ?
> D'oh, donno that!
> 
> What is 'SPAM' ?
> It's SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM
> SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM
> SPAM SPAM
> What is 'spam' ?
> It's SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM
> SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM
> SPAM SPAM
> What is 'spaM' ?
> D'oh, donno that!
> 
> What is 'eggs and ham' ?
> D'oh, donno that!

Very nice indeed :-)

-- 
Marc-Andre Lemburg
CEO eGenix.com Software GmbH
______________________________________________________________________
Consulting & Company:                           http://www.egenix.com/
Python Software:                        http://www.lemburg.com/python/