资讯专栏INFORMATION COLUMN

用 Python 实现简单的 switch/case 语句

王伟廷 / 1919人阅读

摘要:类实现一通过以上约束,我们可以把当成一个类来实现,传入的参数在构造函数里处理,然后再分别实现和方法即可。在构造函数中我们记住了和执行状态,在里如果当前的和匹配并且函数没有被执行过,那么就更新并执行对应的方法。

在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()里如果当前的keyswitch_to匹配并且函数没有被执行过,那么就更新_invoked并执行对应的方法。在default()里检查一下_invoked,如果从没执行过,那么就调用default分支的函数。

看上去还不错,我们来试用一下。

switch("cn").case("cn",cn).case("us",us).default(fail)
>>> cn
switch("us").case("cn",cn).case("us",us).default(fail)
>>> cn
switch("jp").case("cn",cn).case("us",us).default(fail)
>>> fail
switch("cn").case("cn",cn).case("us",us)
>>> cn

让我们来看几个奇葩一点的case。

# duplicate case
switch("us").case("us",cn).case("us",us).default(fail)
>>> cn

def cn() return "cn"
def us() return "us"

# return value
result = switch("cn").case("cn",cn).case("us",us)
result
>>> 

发现了没有,上面的实现不会处理重复的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 False


c = "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可以是任意类型的数据,可以是类或者是方法,所以足够灵活。

关于作者:

Toby Qin, Python 技术爱好者,目前从事测试开发相关工作,转载请注明原文出处。

欢迎关注我的博客 https://betacat.online,你可以到我的公众号中去当吃瓜群众。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42451.html

相关文章

  • Python Switch Case 最佳实践

    摘要:事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。 优美胜于丑陋import this 博客地址:Specific-Dispatch 前言 表驱动法是一种编辑模式(Scheme)——从表里面查找信息而不使用逻辑语句(if 和 case)。事实上,凡是能通过逻辑语句来选择...

    sorra 评论0 收藏0
  • LeetCode 20:有效括号 Valid Parentheses

    摘要:给定一个只包括,,,,,的字符串,判断字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合。注意空字符串可被认为是有效字符串。 给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。 Given a string containing just the characters (, ), {, }, [ and ], determine if the inpu...

    TesterHome 评论0 收藏0
  • switch case 支持 6 种数据类型!

    摘要:中语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。使用包装类型使用枚举类型以下为官网的介绍文档。里面必须跟,不然程序会一个个执行下去,直到最后一个的或者出现。 有粉丝建议可以偶尔推送一些 Java 方面的基础知识,一方面可以帮助一初学者,也可以兼顾中高级的开发者。 那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下。 Ja...

    hss01248 评论0 收藏0
  • 在js开发中,如何减少if else语句使

    摘要:第二步尽量少使用如果在函数中,可以使用,先判断错误条件,然后立马结束函数,防止进入分支。在大多数情况下,的性能不会比低。 那么问题来了,在js开发中,如何减少if else语句的使用 代码中嵌套的if/else结构往往导致代码不美观,也不易于理解。面向过程的开发中代码有大量的IF ELSE,在java中可以用一些设计模式替换掉这些逻辑,那么在js中是否也有类似的方法用来尽可能减少代码中...

    android_c 评论0 收藏0
  • 1、流程控制语句switch 2、数组 3、随机点名器案例

    摘要:如下所示第一小组销售额为万元第二小组销售额为万元第三小组销售额为万元。 01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。 * b:格式如下: swtich(表达式){ case 常量1 : 要执行的...

    余学文 评论0 收藏0

发表评论

0条评论

王伟廷

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<