Python开发中如何优雅的处理多重if...elif...判断

回眸那年,懵懂的我以为学会了if判断,就能轻易判断世间所有逻辑进行处理。时至今日,我依然为我当年的想法所骄傲😂。工作中多重if...elif...经常会遇到,我也像如下的方式写了N+1次,内容如下:

use_standing = "diamond_user"if use_standing == "normal_user":  # 普通用户discount = 0.95# 大量的逻辑代码print("normal_user")
elif use_standing == "gold_user":  # 黄金用户discount = 0.9# 大量的逻辑代码print("gold_user")
elif use_standing == "platinum_user":  # 铂金用户discount = 0.85# 大量的逻辑代码print("platinum_user")
elif use_standing == "diamond_user":  # 钻石用户discount = 0.8# 大量的逻辑代码print("diamond_user")
elif use_standing == "starlight_user":  #  星耀用户discount = 0.7# 大量的逻辑代码print("starlight_user")
elif use_standing == "superior_user":  # 至尊用户discount = 0.6# 大量的逻辑代码print("superior_user")
else:print("The user type does not exist。")

通过判断不同的用户类型,进而针对不同的用户要进行大量的业务逻辑处理,这样的代码经常会有几百行乃至更多。慢慢的我开始厌烦这种代码,哪怕之前是我自己写的,过段时间再修改里面的业务逻辑我都很难受,更何况看到别人写这种,心里就只有MMP。

于是,以后再遇到多重判断逻辑必须优化。

方式1:使用字典的方式。

# 普通用户
def normal_user(type):"""大量的逻辑代码"""return type# 黄金用户
def gold_user(type):"""大量的逻辑代码"""return type# 铂金用户
def platinum_user(type):"""大量的逻辑代码"""return type# 钻石用户
def diamond_user(type):"""大量的逻辑代码"""return type# 星耀用户
def starlight_user(type):"""大量的逻辑代码"""return type# 至尊用户
def superior_user(type):"""大量的逻辑代码"""return typedef inexistence_user(type):return f"The user type {type} does not exist。"user_dict= {"normal_user": normal_user,"gold_user": gold_user,"platinum_user": platinum_user,"diamond_user": diamond_user,"starlight_user": starlight_user,"superior_user": superior_user,
}user_type = "platinum_user"
print(user_dict.get(user_type, inexistence_user)(user_type))

通过将不同的用户类型封装到不同的函数中,进而使用字典键值对获取调用。

方式2:使用EdgeDB中的轮子

代码地址:https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py

我们直接拿来使用即可,示例如下:

源码文件名为value_dispatch.py,直接放在同目录或指定目录下调用就🆗!源码如下:

#
# This source file is part of the EdgeDB open source project.
#
# Copyright 2021-present MagicStack Inc. and the EdgeDB authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#from __future__ import annotations
from typing import *import functools
import inspect
import types_T = TypeVar("_T")class _ValueDispatchCallable(Generic[_T], Protocol):registry: types.MappingProxyType[Any, Callable[..., _T]]def register(self,val: Any,) -> Callable[[Callable[..., _T]], Callable[..., _T]]:...def register_for_all(self,val: Iterable[Any],) -> Callable[[Callable[..., _T]], Callable[..., _T]]:...def __call__(__self, *args: Any, **kwargs: Any) -> _T:...def value_dispatch(func: Callable[..., _T]) -> _ValueDispatchCallable[_T]:"""Like singledispatch() but dispatches by value of the first arg.Example:@value_dispatchdef eat(fruit):return f"I don't want a {fruit}..."@eat.register('apple')def _eat_apple(fruit):return "I love apples!"@eat.register('eggplant')@eat.register('squash')def _eat_what(fruit):return f"I didn't know {fruit} is a fruit!"An alternative to applying multuple `register` decorators is touse the `register_for_all` helper:@eat.register_for_all({'eggplant', 'squash'})def _eat_what(fruit):return f"I didn't know {fruit} is a fruit!""""registry: dict[Any, Callable[..., _T]] = {}@functools.wraps(func)def wrapper(arg0: Any, *args: Any, **kwargs: Any) -> _T:try:delegate = registry[arg0]except KeyError:passelse:return delegate(arg0, *args, **kwargs)return func(arg0, *args, **kwargs)def register(value: Any,) -> Callable[[Callable[..., _T]], Callable[..., _T]]:if inspect.isfunction(value):raise TypeError("value_dispatch.register() decorator requires a value")def wrap(func: Callable[..., _T]) -> Callable[..., _T]:if value in registry:raise ValueError(f'@value_dispatch: there is already a handler 'f'registered for {value!r}')registry[value] = funcreturn funcreturn wrapdef register_for_all(values: Iterable[Any],) -> Callable[[Callable[..., _T]], Callable[..., _T]]:def wrap(func: Callable[..., _T]) -> Callable[..., _T]:for value in values:if value in registry:raise ValueError(f'@value_dispatch: there is already a handler 'f'registered for {value!r}')registry[value] = funcreturn funcreturn wrapwrapper.register = registerwrapper.register_for_all = register_for_allreturn wrapper

使用如下: 

from value_dispatch import value_dispatch@value_dispatch
def get_user_type(type):"""处理不存在的情况"""return f'等级 {type} 不存在'# 普通用户
@get_user_type.register("normal_user")
def normal_user(type):"""大量的逻辑代码"""return type# 黄金用户
@get_user_type.register("gold_user")
def gold_user(type):"""大量的逻辑代码"""return type# 铂金用户
@get_user_type.register("platinum_user")
def platinum_user(type):"""大量的逻辑代码"""return type# 钻石用户
@get_user_type.register("diamond_user")
def diamond_user(type):"""大量的逻辑代码"""return type# 星耀用户
@get_user_type.register("starlight_user")
def starlight_user(type):"""大量的逻辑代码"""return type# 至尊用户
@get_user_type.register("superior_user")
def superior_user(type):"""大量的逻辑代码"""return typeif __name__ == '__main__':print(get_user_type("diamond_user"))

至此,是不是觉得自己的编码逻辑又进了一步,拜拜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java架构师系统架构设计服务拆分

目录 1 服务拆分和子系统模块拆分1.1 服务化架构的优势2 描绘系统蓝图里面的详解服务2.1 为什么拆分服务3 服务拆分的基本要求3.1 服务功能是自包含的3.2 服务呢应该具备独立性和专业性3.3 服务是无状态的3.4 服务之间采用轻量级的通讯机制4 服务拆分的基本方法4.1 按业务边界拆…

centos7.6 安装 rlwrap-0.45报 Requires: /usr/bin/python3

centos7 问题概述 方便翻找历史命令 问题原因 解决方案 1、安装python3 ,readline 2、下载 rlwrap-0.45.2-2.el7.x86_64.rpm 安装时报: [root@opengauss01 ~]# yum -y install rlwrap-0.45.2-2.el7.x86_64.rpm Loaded plugins: fastestmirror Examining rlwrap-0.45.…

关于Jupyter notebook 创建python3 时进去不能重命名问题及不能编程问题

首先写这篇博客时,已经被这个问题折磨了三天,看了很多博客,其实解决这个问题的关键就是要么没有下pyzmq或者等级太高,要么等级太低,首先我会按照我思路来。 问题如图: 1.自动换行 2.不能重命名 我的解决办…

MOM与MES管理系统有哪些本质上的区别

随着企业业务的不断发展,许多制造企业开始面临车间管理失控、生产不透明等问题。这时候,很多企业选择上线MES生产管理系统来提高生产管理水平。然而,随着企业业务的不断拓展,MES系统也逐渐暴露出其局限性。于是,MOM平台…

水库安全监测方案(实时数据采集、高速数据传输)

​ 一、引言 水库的安全监测对于防止水灾和保障人民生命财产安全至关重要。为了提高水库安全监测的效率和准确性,本文将介绍一种使用星创易联DTU200和SG800 5g工业路由器部署的水库安全监测方案。 二、方案概述 本方案主要通过使用星创易联DTU200和SG800 5g工业路…

数字化转型的必备工具:智能呼叫中心系统的应用

数字化转型已经成为企业发展的必然趋势,在这个过程中,智能呼叫中心系统成为了一个不可或缺的工具。智能呼叫中心系统通过整合各种通信渠道和自动化技术,为企业提供了高效、智能的客户服务解决方案。 首先,系统能够集成多种通信渠…

矩阵置零

矩阵置零 题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&#…

ws升级为wss

需求:项目中需要使用netty,本地测试的时候使用的是ws,然后要部署到服务器上,使用https连接,https下就不能用ws了,必须升级到wss 1.阿里云申请免费证书 2.保存证书到本地目录 3.修改代码 SslUtil 工具类…

集成学习

集成学习(Ensemble Learning) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/27689464集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器…

网络爬虫中的代理技术:socks5代理和HTTP代理

网络爬虫是一种非常重要的数据采集工具,但是在进行网络爬虫时,我们经常会遇到一些限制,比如IP封锁、反爬虫机制等,这些限制会影响我们的数据采集效果。为了解决这些问题,我们可以使用代理服务器,其中socks5…

关于打造安卓测试机的方法以及常见问题的解决方式

摘要: 本文主要讲解如何打造安卓测试机,并刷机google原生系统、部署Magisk对测试机进行root的常用方式;并对一些常见问题进行思路解答。本文适合新手学习,大佬请绕过 本次实验使用的设备及环境如下: Nexus 5x 测试机…

transformer系列5---transformer显存占用分析

Transformer显存占用分析 1 影响因素概述2 前向计算临时Tensor显存占用2.1 self-attention显存占用2.2 MLP显存占用 3 梯度和优化器显存占用3.1 模型训练过程两者显存占用3.2 模型推理过程两者显存占用 1 影响因素概述 模型训练框架:例如pytorch框架的cuda context…

深入了解归并排序:原理、性能分析与 Java 实现

归并排序(Merge Sort)是一种高效且稳定的排序算法,其优雅的分治策略使它成为排序领域的一颗明珠。它的核心思想是将一个未排序的数组分割成两个子数组,然后递归地对子数组进行排序,最后将这些排好序的子数组合并起来。…

一个开源的安卓相机:OpenCamera

原网址 Open Camera download | SourceForge.net 我也上传了一个 https://github.com/quantum6/Android-OpenCamera

TensorFlow入门(十四、数据读取机制(1))

TensorFlow的数据读取方式 TensorFlow的数据读取方式共有三种,分别是: ①预加载数据(Preloaded data) 预加载数据的方式,其实就是静态图(Graph)的模式。即将数据直接内嵌到Graph中,再把Graph传入Session中运行。 示例代码如下: import tensorflow.compat.v1 as tf tf.disabl…

符合 EN55022B 规格、LTM4613EY、LTM4613MPV直流µModule稳压器【RG500Q 5G Sub-6 GHz 模块】

一、LTM4613,符合 EN55022B 规格的 36VIN、15VOUT、8A、DC/DC Module 稳压器 (简介)LTM4613 是一款完整、超低噪声、8A 开关模式 DC/DC 电源。封装中内置了开关控制器、功率 FET、电感器和所有的支持元件。LTM4613 的工作输入电压范围为 5V 至…

基于maven的项目搭建(已跑通)

1、直接选择archetype-webapp即可 (这里很多人会觉得很慢–解决方案:https://blog.csdn.net/qq_45591895/article/details/133705674?spm1001.2014.3001.5501) 2、手动添加一个java目录即可。 3、添加Tomcat 3、这就跑通了,可以…

Python 樱花

Python实现樱花 效果图 (源码在下面) 源码: from turtle import * from random import * from math import *def tree(n, l):pd() # 下笔# 阴影效果t cos(radians(heading() 45)) / 8 0.25pencolor(t, t, t)pensize(n / 3)forward(l…

dp=[[0]*n]*m 和dp = [[0] * n for _ in range(m)]的区别是什么?

在力扣刷题需要二维数组时,我选的方法是dp[[0]*n]*m,结果想修改一行的值,全二维数组都被更改了,不懂,查chat: 1.dp[[0]*n]*m: 这种方式创建了一个包含 m 行和 n 列的二维列表 dp,并将…

基于 FPGA 的机器博弈五子棋游戏

基于 FPGA 的机器博弈五子棋游戏 一,设计目的 五子棋是一种深受大众喜爱的游戏,其规则简单,变化多端,非常富有趣味性 和消遣性。棋类游戏在具备娱乐性、益智性的同时也因为其载体大多是手机, 电脑等移动互联网设备导致现代社会低头族等现象更加严重,危害青少年的身 体健康…