巧妙使用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 装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一百多行python代码实现抢票助手

    一百多行python代码实现抢票助手

    一百多行python代码轻松实现抢票助手,十一出行不再愁!本文具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 一文带你吃透Python中的os和sys模块

    一文带你吃透Python中的os和sys模块

    os 模块是 Python中的一个内置模块,也是 Python中整理文件和目录最为常用的模块。sys 模块主要负责与 Python 解释器进行交互,该模块提供了一系列用于控制 Python 运行时环境的不同部分(函数和变量等)。本文主要来聊聊这两个模块的使用,希望对大家有所帮助
    2023-02-02
  • Python Pexpect库自动化交互式进程控制的expect_list方法解析

    Python Pexpect库自动化交互式进程控制的expect_list方法解析

    Pexpect是一个Python库,为自动化和交互式进程控制提供了丰富的功能,而expect_list方法是其功能强大且灵活的一部分,将详细探讨如何使用这一方法,并提供多个示例来说明其应用场景和功能
    2024-01-01
  • 详解OpenMV图像处理的基本方法

    详解OpenMV图像处理的基本方法

    这篇文章主要介绍了OpenMV图像处理的基本方法,包括感光元件的相关知识介绍,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • python多进程重复加载的解决方式

    python多进程重复加载的解决方式

    今天小编就为大家分享一篇python多进程重复加载的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python字节单位转换(将字节转换为K M G T)

    Python字节单位转换(将字节转换为K M G T)

    这篇文章主要介绍了Python字节单位转换(将字节转换为K M G T),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 深入理解Python中变量赋值的问题

    深入理解Python中变量赋值的问题

    在 python 中赋值语句总是建立对象的引用值,而不是复制对象。因此,python 变量更像是指针,而不是数据存储区域,这点和大多数语言类似吧,比如 C++、java 等。下面这篇文章主要介绍了Python中变量赋值的问题,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • python基于opencv实现人脸识别

    python基于opencv实现人脸识别

    这篇文章主要介绍了python基于opencv实现人脸识别的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • 解决Building wheel for wrapt (setup.py) ... error的问题

    解决Building wheel for wrapt (setup.py) ... error的问题

    这篇文章主要介绍了解决Building wheel for wrapt (setup.py) ... error的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • python爬取网页数据到保存到csv

    python爬取网页数据到保存到csv

    大家好,本篇文章主要讲的是python爬取网页数据到保存到csv,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01

最新评论