首先考虑why there is no case statement in Python。所以重置你的大脑并忘记它们。
您可以使用对象类、函数装饰器或使用函数字典来获得相同或更好的结果。
这是一个简单的简单示例:
#!/usr/bin/env python
import re
def hat(found):
if found: print "found a hat"
else: print "no hat"
def cat(found):
if found: print "found a cat"
else: print "no cat"
def dog(found):
if found: print "found a dog"
else: print "no dog"
st="""
Here is the target string
with a hat and a cat
no d o g
end
"""
patterns=['hat', 'cat', 'dog']
functions=[hat,cat,dog]
for pattern,case in zip(patterns,functions):
print "pattern=",pattern
case(re.search(pattern,st))
C 风格的 case/switch 语句也“落空”,例如:
switch(c) {
case 'a':
case 'b':
case 'c': do_abc();
break;
... other cases...
}
使用元组和可调用列表,您可以获得类似的行为:
st="rat kitten snake puppy bug child"
def proc1(st): print "cuddle the %s" % st
def proc2(st): print "kill the %s" % st
def proc3(st): print "pick-up the %s" % st
def proc4(st): print "wear the %s" % st
def proc5(st): print "dispose of the %s" %st
def default(st): print "%s not found" % st
dproc={ ('puppy','kitten','child'):
[proc3, proc1],
('hat','gloves'):
[proc3, proc4],
('rat','snake','bug'):
[proc2, proc3, proc5]}
for patterns,cases in dproc.iteritems():
for pattern in patterns:
if re.search(pattern,st):
for case in cases: case(pattern)
else: default(pattern)
print
这使得找到的物品的顺序正确:1)抱起孩子,拥抱孩子; 2)杀死老鼠,捡起老鼠......用可以理解的语法用C switch 语句做同样的事情是很困难的。
还有许多其他方法可以模仿 C 的 switch 语句。这是一个使用函数装饰器的(对于整数):
case = {}
def switch_on(*values):
def case_func(f):
case.update((v, f) for v in values)
return f
return case_func
@switch_on(0, 3, 5)
def case_a(): print "case A"
@switch_on(1,2,4)
def case_b(): print "case B"
def default(): print "default"
for i in (0,2,3,5,22):
print "Case: %i" % i
try:
case[i]()
except KeyError:
default()
用Programming Perl 中关于理解 Perl 上下文的 Larry Wall、Tom Christiansen、Jon Orwant 的解释:
除非你使用语言原生的习语,否则你会很痛苦地编写 Python...