Python小技巧!如何简化大量的 if…elif…else 代码?
Python爱好者社区
Python爱好者社区
微信号 python_shequ
功能介绍 人生苦短,我用Python。分享Python相关的技术文章、工具资源、精选课程、视频教程、热点资讯、学习资料等。每天自动更新和推送。
2021-12-14原文
收录于话题
以下文章来源于未闻Code ,作者kingname
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图1
未闻Code
.
博主喜欢Python和爬虫,已经出了两本书。这里是他灵感的发源地。关注这个公众号,你的生产效率在三天内就会得到提高。P.S.: 这个公众号日更。

花下猫语:在日常代码中,我们总是会面对大量 if…elif…else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if…elif,并且设法把每个分支下的内容抽取成独立的函数。结构清晰,意图明白,对于编写和阅读都是极大的便利。不过,在某些特殊的情况下,还可以使用其它更为优雅的写法,比如我们之前分享过的《不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?》,以及今天要分享的这篇文章,可以开阔一下代码编写思路。
今天在 Github 阅读EdgeDB**[1]*的代码,发现它在处理大量if…elif…else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。
正好今天是双十一,假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if … elif…写法是这样的:
def get_discount(level):
if level == 1:
“大量计算代码” discount = 0.1 elif level == 2:
“大量计算代码” discount = 0.2 elif level == 3:
discount = 0.3 elif level == 4:
discount = 0.4 elif level == 5:
discount = 0.5 elif level == 6:
discount = 3 + 2 - 5
0.1 else:
return ‘等级错误’ return discount
大家都知道,这样大量的if … elif…代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。
有一些同学知道,可以使用字典来改写这个太长的 if 判断:
def parse_level_1():
“大量计算代码” discount = 0.1 return discount
def parse_level_2():
“大量计算代码” discount = 0.2 return discount
def parse_level_3():
“大量计算代码” discount = 0.3 return discount
def parse_level_4():
“大量计算代码” discount = 0.4 return discount
def parse_level_5():
“大量计算代码” discount = 0.5 return discount
def parse_level_6():
“大量计算代码” discount = 3 + 2 - 5 * 0.1 return discount

discount_map = {
1: parse_level_1,
2: parse_level_2,
3: parse_level_3,
4: parse_level_4,
5: parse_level_5,
6: parse_level_6,
}

discount = discount_map.get(level, ‘等级错误’)
但今天我学到的这个方法,比用字典更简单。我们先来看它的效果:
@value_dispatchdef get_discount(level):
return ‘等级错误’
@get_discount.register(1)def parse_level_1(level):
“大量计算代码” discount = 0.1 return discount
@get_discount.register(2)def parse_level_2(level):
“大量计算代码” discount = 0.2 return discount
@get_discount.register(3)def parse_level_3(level):
“大量计算代码” discount = 0.3 return discount
@get_discount.register(4)def parse_level_4(level):
“大量计算代码” discount = 0.4 return discount
@get_discount.register(5)def parse_level_5(level):
“大量计算代码” discount = 0.5 return discount
@get_discount.register(6)def parse_level_1(level):
“大量计算代码” discount = 3 + 2 - 5 * 0.1 return discount

discount = get_discount(3)
print(f’等级3的用户,获得的折扣是:{discount}’)
运行效果如下图所示:
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图2
这样写,比用字典的方式更直观,比直接用if … elif…更简洁。
那么,这个装饰器value_dispatch是怎么实现的呢?密码就藏在这个开源项目EdgeDB的源代码**[2]中,核心代码只有20多行:
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图3
并且,还能够实现或查询。例如用户等级为2或者3的时候,折扣都是0.2,那么代码可以写成:
@get_discount.register(2)
@get_discount.register(3)def parse_level_2(level):
“大量计算代码” discount = 0.2 return discount
运行效果如下图所示:
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图4
它这个代码目前只能实现相等的查询。但其实只要对这个代码稍作修改,我们就能实现大于、小于、大于等于、小于等于、不等于、in等等判断。如果大家有兴趣的话,请在文章下面留言,我们明天就来说说怎么对这个代码进行改造,实现更多的逻辑判断。
参考文献
[1] EdgeDB: https://github.com/edgedb/edgedb
[2] 源代码: https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py
重磅!Python交流群已成立**
公众号运营至今,离不开小伙伴们的支持。
为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。
群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图5
▲长按扫码

精选留言

[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图6
Give Me Five赞:2
他这个思路和标准库中的singledispatch装饰器很像,但是更加灵活,可以在策略模式中使用,解决策略注册的流程[强]
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图7
Charleson Taylor赞:1
期待的搓手手~
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图8
🇦 🇦 🇦 🇦 🇦 🇦赞:0
好家伙,学到了学到了666
[Python爱好者社区] - 2021-12-14 Python小技巧!如何简化大量的 if…elif…else 代码_ - 图9
Allen赞:0
不知道为啥莫名想起计算机组织写过的底层代码..