Python開發實踐經驗
這是我在公司專案中寫下的約定, 該專案使用Python3開發, 分享出來, 希望對大家也會有一些幫助
-
專案杜絕迴圈引用, 包之間的引用關係為(
->
表示被引用)models -> controllers -> application ^^ \/ \ utilsservice
-
包內相對引用,包外絕對引用
-
controllers
,models
,utils
都是package
,使用__all__
來管控其下面的成員, 所有程式碼使用如下方式匯入:from itachi.models import Base
而不是from itachi.models.base import Base
單元測試除外, 單元測試可能需要mock包內成員, 所以可能需要跳過
__all__
的限制 -
每個單元測試用例必須自己清理自己建立的資料
-
單元測試必須繼承
tests/base.py -> BaseCase
, 使用prehook
和posthook
替代setUp
和tearDown
, 因為base中處理的app的context順序會影響單元測試(因為這個專案用的是flask,所以這一點比較蛋疼) -
每次修改完資料庫,必須顯示commit
session.commit()
-
禁止使用
lazy import
這種方式來規避迴圈引用,正確的方式是合理的規劃程式碼組織, 參見第一條 -
推送使用介面來定義, 見
itachi/services/push/base.py
, 由於python沒有明確宣告介面的方式, 所以還請人為遵守 -
非同步任務task應當是可重入的, 會配置為重試
-
顯示優於隱式, 所以不要用各種trick
-
requirements.txt
和requirements-dev.txt
分別對應正式和開發環境的依賴, 其中後者僅包含前者的增量部分 -
嚴禁for迴圈查資料庫,請使用連表代替,連表時請把一次效能過濾最多的條件放在上面(即區分度最大的條件)
-
請求第三方介面一定要設定超時
-
資料庫(SQL/">MySQL)使用
utf8mb4
(而不是utf8
)作為預設的字符集, 因為MySQL的utf8
不是我們平日裡所說的utf8,它只能利用 最多三個位元組,因此無法使用儲存emoji
目前發現的可以改善的地方
-
[x] session可以和request脫離,手動
session = Session()
而非app.before_request
-
[ ] constants 可以使用
Enum
類