一对一视频直播源码,利用枚举提升代码的可读性

一对一视频直播源码,利用枚举提升代码的可读性

枚举(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)

 

以上就是一对一视频直播源码,利用枚举提升代码的可读性, 更多内容欢迎关注之后的文章

 

posted @ 2024-06-29 08:58  云豹科技-苏凌霄  阅读(1)  评论(0编辑  收藏  举报