今天在Github上看了EdgeDB的代码,发现它在处理大量的if...elif...else判断时,使用了一个非常巧妙的装饰器。让我们来看看这个方法是什么样子的。假设我们要做一个功能,根据用户的等级来判断用户可以获得的折扣。常规的if...elif...是这样写的:defget_discount(level):iflevel==1:"大计算码"discount=0.1eliflevel==2:"大计算码"discount=0.2elifLevel==3:Discount=0.3ElifLevel==4:Discount=0.4ElifLevel==5:Discount=0.5ElifLevel==6:Discount=3+2-5*0.1ELSE:ReturNDis大家都知道这样的大量的if...elif...代码非常丑陋且难以维护。如果有很多代码,则在每个内部。这个函数会被拉得很长。有同学知道可以用字典改写这个太长的if判断:defparse_level_1():"大量计算代码"discount=0.1returndiscountdefparse_level_2():"大量计算代码"discount=0.2返回discountDefparse_level_3():“todripded=0.3returesddefparse_level_4():“wistded=0.4折扣=0.4返回discountDefparse_level_5():”计算代码"discount=3+2-5*0.1returndiscountdiscount_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(错误级别不过今天‘水平’,我学到的方法比用字典简单多了。先看看它的效果:@value_dispatchdefget_discount(level):return'levelerror'@get_discount.register(1)defparse_level_1(level):"大计算码"discount=0.1returndiscount@get_discount.register(2)defparse_level_2(level):"大计算码"discount=0.2returndiscount@get_discount.register(3)defparse_level_3(level):"大计算码"discount=0.3returndiscount@get_discount.register(4)def4parse_level_):"A大量计算代码"discount=0.4returndiscount@get_discount.register(5)defparse_level_5(level):"大量计算代码"discount=0.5returndiscount@get_discount.register(6)defparse_level_1(level):《大数计算代码》discount=3+2-5*0.1returndiscountdiscount=get_discount(3)print(f'3级用户,获得的折扣为:{discount}')运行效果如下图:这样写,比起字典的方式更直观也更简洁比直接用if...elif....那么,这个装饰器value_dispatch是怎么实现的呢?密码隐藏在EdgeDB这个开源项目的源代码中,核心代码只有20多行:而且还可以实现或查询。比如当用户等级为2或3时,折扣为0.2,那么代码可以写成:@get_discount.register(2)@get_discount.register(3)defparse_level_2(level):"大计算代码"discount=0.2returndiscount运行效果如下图:这段代码目前只能实现相等查询。但其实只要稍加修改这段代码,我们就可以实现大于、小于、大于等于、小于等于、不等于、in等判断。如果您有兴趣,请在文章下方留言。明天我们再说如何修改这段代码,实现更多的逻辑判断。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。或者去编程学习网了解更多编程技术知识。
