巧妙使用Python装饰器处理if...elif...else

 更新时间:2021年11月18日 14:33:48   作者:Python学习与数据挖掘  
大家好,今天在 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_dispatch
def 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}')

运行效果如下图所示:

图片

这样写,比用字典的方式更直观,比直接用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 装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通俗的讲解深度学习中CUDA,cudatookit,cudnn和pytorch的关系

    通俗的讲解深度学习中CUDA,cudatookit,cudnn和pytorch的关系

    有些刚入行的朋友总是搞不清楚CUDA,cudatookit,cudnn和pytorch的关系,那么今天这篇文章用通俗易懂的话讲解了他们之间的关系,需要的朋友可以参考下,相信会对你有所帮助
    2023-03-03
  • Flask框架之数据交互的实现

    Flask框架之数据交互的实现

    本文主要介绍了Flask框架之数据交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • matplotlib共享坐标轴的实现(X或Y坐标轴)

    matplotlib共享坐标轴的实现(X或Y坐标轴)

    在作图的过程中,我们经常会遇到子图共用坐标轴的情况,或是共用横轴标轴,也可能是纵坐标轴。本文就介绍了matplotlib共享坐标轴,感兴趣的可以了解一下
    2021-05-05
  • Python爬虫之Spider类用法简单介绍

    Python爬虫之Spider类用法简单介绍

    这篇文章主要介绍了Python爬虫之Spider类用法简单介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 在Django框架中设置语言偏好的教程

    在Django框架中设置语言偏好的教程

    这篇文章主要介绍了在Django框架中设置语言偏好的教程,Django是最具人气的Python框架,需要的朋友可以参考下
    2015-07-07
  • Java中的各种单例模式优缺点解析

    Java中的各种单例模式优缺点解析

    这篇文章主要介绍了Java中的各种单例模式解析,单例模式是Java中最简单的设计模式之一,这种类型的设计模式属于创建者模式,它提供了一种访问对象的最佳方式,需要的朋友可以参考下
    2023-07-07
  • Python如何使用turtle库绘制图形

    Python如何使用turtle库绘制图形

    这篇文章主要介绍了Python如何使用turtle库绘制图形,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 12个步骤教你理解Python装饰器

    12个步骤教你理解Python装饰器

    这篇文章主要介绍了12个步骤教你理解Python装饰器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python GUI图形化编程wxpython的使用

    python GUI图形化编程wxpython的使用

    这篇文章主要介绍了python GUI图形化编程wxpython的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python实现指定数组下标值正序与倒序排序算法功能举例

    Python实现指定数组下标值正序与倒序排序算法功能举例

    在程序中,经常需要按数组倒序或反序重新排列数组,下面这篇文章主要给大家介绍了关于Python实现指定数组下标值正序与倒序排序算法功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论