您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:巧妙使用Python装饰器处理if...elif...else

51自学网 2022-02-21 10:48:03
  python
这篇教程巧妙使用Python装饰器处理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 discountdef parse_level_2():    "大量计算代码"    discount = 0.2    return discountdef parse_level_3():    "大量计算代码"    discount = 0.3    return discountdef parse_level_4():    "大量计算代码"    discount = 0.4    return discountdef parse_level_5():    "大量计算代码"    discount = 0.5    return discountdef parse_level_6():    "大量计算代码"    discount = 3 + 2 - 5 * 0.1    return discountdiscount_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 discountdiscount = get_discount(3)print(f'等级3的用户,获得的折扣是:{discount}')

运行效果如下图所示:

图片

这样写,比用字典的方式更直观,比直接用if ... elif...更简洁。

那么,这个装饰器value_dispatch是怎么实现的呢?密码就藏在这个开源项目EdgeDB的源代码[2]中,核心代码只有 20 多行:

图片

并且,还能够实现或查询。例如用户等级为 2 或者 3 的时候,折扣都是 0.2,那么代码可以写成:

@get_discount.register(2)@get_discount.register(3)def parse_level_2(level):    "大量计算代码"    discount = 0.2    return discount

运行效果如下图所示:

图片

它这个代码目前只能实现相等的查询。但其实只要对这个代码稍作修改,我们就能实现大于、小于、大于等于、小于等于、不等于、in等等判断。如果大家有兴趣的话,请在文章下面留言,我们明天就来说说怎么对这个代码进行改造,实现更多的逻辑判断。

参考文献

[1] EdgeDB: https://github.com/edgedb/edgedb

[2] 源代码: https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

到此这篇关于巧妙使用Python装饰器处理if...elif...else的文章就介绍到这了,更多相关Python 装饰器内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python实战之基于OpenCV的美颜挂件制作
利用python实现聚类分析K-means算法的详细过程
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。