Python中switch的實現

來源:互聯網
上載者:User

眾所周知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***

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.