巧妙使用Python装饰器处理if...elif...else
我们来看看这个方法具体是什么样的。假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if … elif…写法是这样的:
def get_discount(level):if level == 1:"大量计算代码"discount = 0.1elif level == 2:"大量计算代码"discount = 0.2elif level == 3:discount = 0.3elif level == 4:discount = 0.4elif level == 5:discount = 0.5elif level == 6:discount = 3 + 2 - 5 * 0.1else:return '等级错误'return discount
大家都知道,这样大量的
if ... elif...
代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。有一些同学知道,可以使用字典来改写这个太长的 if 判断:
def parse_level_1():"大量计算代码"discount = 0.1return discountdef parse_level_2():"大量计算代码"discount = 0.2return discountdef parse_level_3():"大量计算代码"discount = 0.3return discountdef parse_level_4():"大量计算代码"discount = 0.4return discountdef parse_level_5():"大量计算代码"discount = 0.5return discountdef parse_level_6():"大量计算代码"discount = 3 + 2 - 5 * 0.1return 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.1return discount@get_discount.register(2)def parse_level_2(level):"大量计算代码"discount = 0.2return discount@get_discount.register(3)def parse_level_3(level):"大量计算代码"discount = 0.3return discount@get_discount.register(4)def parse_level_4(level):"大量计算代码"discount = 0.4return discount@get_discount.register(5)def parse_level_5(level):"大量计算代码"discount = 0.5return discount@get_discount.register(6)def parse_level_1(level):"大量计算代码"discount = 3 + 2 - 5 * 0.1return 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.2return 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装饰器处理if...elif...else的文章就介绍到这了,更多相关Python 装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- iOS中的Block