一對一影片直播原始碼,利用列舉提升程式碼的可讀性

云豹科技-苏凌霄發表於2024-06-29

一對一影片直播原始碼,利用列舉提升程式碼的可讀性

列舉(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)

以上就是一對一影片直播原始碼,利用列舉提升程式碼的可讀性, 更多內容歡迎關注之後的文章

相關文章