js css html

Python switch case 全兼容写法

2023-04-02  本文已影响0人  AlienPaul

背景

Python 2.x和3.x早期版本一直没有提供switch case的语法支持。为了实现类似的逻辑,我们不得不使用一连串的ifelif判断分支,代码十分的冗长可读性不高。

Python 3.10终于为我们带来了switch case 语法的支持。但问题来了,我们在愉快享受新版本switch case的便利之时,老版本的兼容性就被丢掉了。现阶段我们不得不考虑如何写出同时兼容Python2和Python3的代码。

下面为大家带来一种较为简洁易读,并且又兼容Python2和Python3的switch case功能代码的写法。

示例写法

为了方便说明,本人将swtich case逻辑封装在了switch_method方法。代码和示例如下所示。

def switch_method(i):
    return {
        i <= 4: 0,
        4 < i <= 8: 1,
        8 < i <= 16: 2,
        i > 16: 3
    }[1]


if __name__ == '__main__':

    print(switch_method(2))
    print(switch_method(5))
    print(switch_method(12))
    print(switch_method(20))

运行结果:

0
1
2
3

分析:

这里使用Python的dict来表示条件和结果值之前的关系。dictkey返回的是布尔类型。在传入参数后,实际上这个dict的值为{True:'value1', False:'value2'}。为什么说这里的True和False只出现一次呢?因为dict的key是不能重复的。如果key相同,原来这个key对应的value会被替换。

dict的作用搞明白了,那么最后的[1]意思是什么呢?[1]相当于[True]。由于这个字典的key是布尔类型,1会被隐式转换为True。意思也就是获取True这个key对应的值。

综上,switch_method方法的执行效果为,逐个匹配dictkey的条件表达式,找到匹配的条件,获取它对应的值。

注意事项:dict中的条件不要相互重叠,意思就是一个值匹配多个条件。因为在Python 3.6之前字典是无序的,我们没法保证条件匹配的顺序。对于同一个值,匹配的结果很可能不同,极易造成很隐蔽的bug,务必引起注意。

上一篇 下一篇

猜你喜欢

热点阅读