一對一影片直播原始碼,利用列舉提升程式碼的可讀性
列舉(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)
以上就是一對一影片直播原始碼,利用列舉提升程式碼的可讀性, 更多內容歡迎關注之後的文章