任务
需要根据某个控制变量的值执行不同的代码片段——在其他的语言中你可能会使用case 语句。
解决方案
归功于面向对象编程的优雅的分派概念,case语句的使用大多(但不是所有)都可以被替换成其他分派形式。在Python中,字典及函数是一等(first-class)对象这个事实(比如函数可以作为字典中的值被存储),使得“case 语句”的问题更容易被解决。比如,考虑下面的代码片段:
animals = [ ]
number_of_felines = 0
def deal_with_a_cat():
global number_of_felines
print "meow"
animals.append('feline')
number_of_felines += 1
def deal_with_a_dog():
print "bark"
animals.append('canine')
def deal_with_a_bear():
print "watch out for the *HUG*!"
animals.append('ursine')
tokenDict ={
"cat":deal_with_a_cat,
"dog":deal_with_a_dog,
"bear":deal_with_a_bear,
#模拟,比如,从文件中读取的一些单词
words = ["cat","bear","cat","dog"]
for word in words :
#查找每个单词对应的函数调用并调用之
return tokenDict[word]()
nf = number_of_felines
print 'we met %d feline%s'(nf,'s'[nf==l:])
print 'the animals we met were:',''.join(animals)
讨论
本节的要点是,构建一个字典,以字符串(或其他对象)为键,以被绑定的方法、函数或其他的可调用体作为值。在每一步的执行过程中,我们都先用字符串键来选择需要执行的可调用体。这个方法可以被当做一个通用的 case 语句用于各处。
这确实非常简单,我也经常使用这种技术。还可以使用被绑定的方法或者其他可调用体来替换本节示例中查找的函数。但当你使用未绑定的方法时,需要传递一个正确的对象作为第一个参数来调用它们。还可以将可调用体和它所需要的参数放在一个元组中,然后把元组当做字典的值存储起来,这样具有更强的通用性。
在别的语言中,可能需要case、switch或者select语句,但在 Python 中,所有类似的地方都用这个技术来实现同样的功能。