一对一视频直播源码,利用枚举提升代码的可读性
一对一视频直播源码,利用枚举提升代码的可读性
枚举(Enum)是Python自带的特性,用来定义有多个有限值时是绝佳的应用场景。先定义了状态枚举类
import enum class StudyStatusEnum(enum.Enum): no_start = 0 # 未开始 learning = 1 # 学习中 finish = 2 # 已学完 expired = 3 # 过期
然后将前面的逻辑修改成:
if status==StudyStatusEnum.no_start: pass elif status==StudyStatusEnum.leanring: pass if finished: status = StudyStatusEnum.finish
如果一对一视频直播源码中用的ORM框架是SQLAlchemy,那么要同时修改status属性的定义
class Study(Models): # status = db.Column(db.SmallInteger, default=0, comment="学习状态 0 未开始 1 学习中 2 已完成") status = db.Column(Enum(StudyStatusEnum), default=StudyStatusEnum.no_start)
这样修改其实有个问题是,枚举类型在一对一视频直播源码数据库中对应的是字符串类型,而实际上我们希望存一个int类型,对应枚举的value值,而不是枚举的name属性。
所以,这时候我们可以基于SQLAlchemy提供的TypeDecorator来自定义Enum类型叫做IntEnum。
from sqlalchemy import TypeDecorator, Integer class IntEnum(TypeDecorator): """ 整数枚举类型 主要用于状态等场景 """ impl = Integer def __init__(self, enumtype, *args, **kwargs): super().__init__(*args, **kwargs) self._enumtype = enumtype def process_bind_param(self, value, dialect): # 入库时调用此方法,返回的是枚举的value return value.value def process_result_value(self, value, dialect): # 从数据库加载到内存时的值,返回的一个枚举实例 return self._enumtype(value)
我们只需要重写这三个方法,即可已实现一个可以保存int类型的枚举。
status = db.Column(IntEnum(StudyStatusEnum), default=StudyStatusEnum.no_start)
以上就是一对一视频直播源码,利用枚举提升代码的可读性, 更多内容欢迎关注之后的文章