您好,欢迎访问一九零五行业门户网

Python实现switch/case语句的方法

本篇文章给大家带来的内容是关于python实现switch/case语句的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在python中是没有switch / case语句的,很多人认为这种语句不够优雅灵活,在python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的python玩家不得不承认,的确如此。
但今天我们还是来看看如果一定要用python来switch / case,可以怎么玩。
语法约束我们先定义一下switch/case应该怎么表达,为了简单我们可以让它长成这样。
def cn():    print('cn')def us():    print('us')switch(lang).case('cn',cn)            .case('us',us)               .default(us)
类实现一通过以上约束,我们可以把switch当成一个类来实现,传入的参数在构造函数里处理,然后再分别实现case和default方法即可。
class switch(object):    def __init__(self, case_path):        self.switch_to = case_path        self._invoked = false    def case(self, key, method):        if self.switch_to == key and not self._invoked:            self._invoked = true            method()        return self    def default(self, method):        if not self._invoked:            self._invoked = true            method()
在构造函数中我们记住了case_path 和执行状态_invoked,在case()里如果当前的key和switch_to匹配并且函数没有被执行过,那么就更新_invoked并执行对应的方法。在default()里检查一下_invoked,如果从没执行过,那么就调用default分支的函数。
看上去还不错,我们来试用一下。
switch('cn').case('cn',cn).case('us',us).default(fail)>>> cnswitch('us').case('cn',cn).case('us',us).default(fail)>>> cnswitch('jp').case('cn',cn).case('us',us).default(fail)>>> failswitch('cn').case('cn',cn).case('us',us)>>> cn
让我们来看几个奇葩一点的case。
# duplicate caseswitch('us').case('us',cn).case('us',us).default(fail)>>> cndef cn() return 'cn'def us() return 'us'# return valueresult = switch('cn').case('cn',cn).case('us',us)result>>> <python_switch_case.switch object at 0x11034fb70>
发现了没有,上面的实现不会处理重复的case,当然你可以加强一下case方法,最好是抛出异常,其他编程语言通常都这样做。
第二个问题,你希望从case里拿到返回值,像上面的写法是没希望了,因为扔掉了。我们可以考虑在switch类里加一个result的变量来保存执行结果。
class switch(object):    def __init__(self, case_path):        ...        self.result = none    def case(self, key, method):        ...        self.result = method()    ...
在调用结束后,就可以通过result拿到结果了。
_ = switch('cn').case('cn',cn).case('us',us)_.result>>> cn
类实现二我大概在网上搜了一下,你还可以参考brian beck通过类来实现swich/case。
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:            self.fall = true            return true        else:            return falsec = 'z'for case in switch(c):    if case('a'): pass  # only necessary if the rest of the suite is empty    if case('c'): 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!)
这种实现相对复杂一点,而且用起来也不是很舒服,又需要for又需要if(还不如直接if/else痛快)。当然也有好处,就是可以把相同结果的case放一起,而且case里可以写更多东西,不仅仅是一个方法名。
写在最后最后我们还是回到python推崇的方法来处理switch/case问题,一般我们可以通过字典来处理这种多分支的问题,举例说明。
mapping = {    'cn': cn,    'us': us}lang = 'cn'result = mapping.get(lang, default=us)
是不是一目了然,不仅易于阅读也易于维护。在字典中key是唯一的,value可以是任意类型的数据,可以是类或者是方法,所以足够灵活。
以上就是python实现switch/case语句的方法的详细内容。
其它类似信息

推荐信息