眾所周知Python中是沒有switch的,一般而言是用if-else來代替的,如C語言下的
switch (key) { case 'a': /* do_a */ break; case 'b': /* do_b */ break; case 'c': /* do_c */ break;}
在Python中一般表示成
if key == 'a': # do_aelif key == 'b': # do_belif key == 'c': # do_c
if-else足夠簡單,也足夠實用,它也能類比出多個case完成同樣的事,及default情況。
不過也有人喜歡dict來實現
{ 'a': do_a, 'b': do_b, 'c': do_c}[key](x)
不過上面的實現沒辦法類比出多個case完成同樣的事的情況,勉強能夠實現default,不過就比較醜陋了
try: { 'a': do_a, 'b': do_b, 'c': do_c }[key](x)except KeyError: do_default
自己也嘗試利用類實現了一個,結合了使用類類比了dict部分屬性,來擴充dict以可以類比出多個case完成同樣的事,及default情況。
class Switch: def __init__(self, data = {}): self.data = {} for key in data.keys(): if type(key) == tupe: for k in key: self.data[k] = data[key] else: self.data[key] = data[key] def __setitem__(self, key, item): self.data[key] = item def __getitem__(self, key): if key in self.data.keys(): return self.data[key] else: return self.data['default']# end Switch# 使用,這裡展示了一個嵌套switch的例子Switch ({ 'a': Switch ({ 1: do_a_1, (2, 3): do_a_2, 'default': do_a }), 'b': Switch ({ 1: do_b_1, (2, 3): do_b_2, 'default': do_b }), 'default': Switch ({ 'default': do_default })}) [key1][key2] ()
不過自己看了後覺得依舊醜陋啊。 ==!
上網google了一下,發現了一個大牛的switch
## {{{ http://code.activestate.com/recipes/410692/ (r8)# This class provides the functionality we want. You only need to look at# this if you want to know how this works. It only needs to be defined# once, no need to muck around with its internals.class switch(object): def __init__(self, value): self.value = value self.fall = False def __iter__(self): """Return the match method once, then stop""" yield self.match raise StopIteration def match(self, *args): """Indicate whether or not to enter a case suite""" if self.fall or not args: return True elif self.value in args: # changed for v1.5, see below self.fall = True return True else: return False# The following example is pretty much the exact use-case of a dictionary,# but is included for its simplicity. Note that you can include statements# in each suite.v = 'ten'for case in switch(v): if case('one'): print 1 break if case('two'): print 2 break if case('ten'): print 10 break if case('eleven'): print 11 break if case(): # default, could also just omit condition or 'if True' print "something else!" # No need to break here, it'll stop anyway# break is used here to look as much like the real thing as possible, but# elif is generally just as good and more concise.# Empty suites are considered syntax errors, so intentional fall-throughs# should contain 'pass'c = 'z'for case in switch(c): if case('a'): pass # only necessary if the rest of the suite is empty if case('b'): pass # ... if case('y'): pass if case('z'): print "c is lowercase!" break if case('A'): pass # ... if case('Z'): print "c is uppercase!" break if case(): # default print "I dunno what c was!"# As suggested by Pierre Quentel, you can even expand upon the# functionality of the classic 'case' statement by matching multiple# cases in a single shot. This greatly benefits operations such as the# uppercase/lowercase example above:import stringc = 'A'for case in switch(c): if case(*string.lowercase): # note the * for unpacking as arguments print "c is lowercase!" break if case(*string.uppercase): print "c is uppercase!" break if case('!', '?', '.'): # normal argument passing style also applies print "c is a sentence terminator!" break if case(): # default print "I dunno what c was!"# Since Pierre's suggestion is backward-compatible with the original recipe,# I have made the necessary modification to allow for the above usage.## end of http://code.activestate.com/recipes/410692/ }}}
不過回頭看看,覺得為了一個switch作這麼多蛋疼的事,倒不如老老實實的用if-else,正應了一句話“步子邁大了,會扯著蛋”。
寫這麼多屁話,只是想找個地方儲存一些代碼。
***END***