一、 基礎風格:遵循PEP
- 陳述句編排:
- 每個陳述句獨占一行,勿在行尾加分號, 也不要用分號將多條陳述句放在同一行,
- 另起一行,即使定義,陳述句較為簡單:
- if/for/while 陳述句中
- 類定義:
class UnfoundError(Exception): pass
- 建議多行:
- 函式和方法的括號中引數或者元素過多時,建議換行多層縮進書寫解決
- 空格使用:
- 不加空格:
- 各類括號內接陳述句前后不加空格
- 引數中默認值
- 加空格: 基本符號后(口號,冒號)前不加空格,后加 使用等號的場景(除引數默認值)
- 不加空格:
- 命名規范:
- 小寫配合下劃線場景:
- 檔案名
- 類方法和屬性
- 駝峰場景:
- 類名
- 大寫與下劃線配合場景:
- 全域變數名
- 下劃線使用開頭(同樣應用于模塊,檔案):
- 為其實體的私有方法(默認:不建議實體外部呼叫,但不影響獲取其值)
- 雙下劃線開頭(同樣應用于模塊,檔案):
- 為其私有方法,不允許外部呼叫,僅可在內部方法之間使用(原因:是防止呼叫,內部進行了對進行了多載)
- 在不多載類屬性時,不建議定義以雙下劃線開頭和結尾的方法
- 小寫配合下劃線場景:
- 判斷比較:
- 可能的話使用 is/is not 代替 ==(并不是所有的都可以,== 與 is 不等價)
- 使用 isinstance() 比較物件的型別,而不是 type()
- 使用 startswith() 和 endswith() 代替切片進行序列前綴或后綴的檢查,
- if、while、for 時無需專門使用陳述句判斷物件真值
- 拼接:
- 字串,list,tuple等,建議使用join 替代 + ;
- 路徑拼接,如果跨平臺,建議使用os.path.join or pathlib
- 效率: 使用迭代器和生成器代替串列等資料結構效率更高,使用串列(字典)決議式和生成器運算式比用回圈效率更高,
- 好的習慣:
- try: ... except ...., except 后面例外型別確認的話,明確寫上各型別
- 檔案模塊:功能結構眾多,期望有if __name__ == "__main__" 代碼塊,標準函式執行邏輯程序:
if__name__ =="__main__": do1() do2() - 使用推導式,map,filter,reduce等代替for,while回圈處理
- 包模塊擁有自己定義的例外型別
- 類的方法第一個引數必須是self,而靜態方法第一個引數必須是cls,盡可能的使用 classmethod, staticmethod
二、特別:
1. 模塊匯入格式
- 位于最頂層,或者頂層注釋與代碼塊中間
- 匯入應該按照從最通用到最不通用的順序分組:
- 標準庫匯入
- 第三方庫匯入
- 應用程式指定匯入
- 不建議使用 from flask import * 形式匯入,污染全域變數
- 針對模塊檔案中存在大量函式情況下,建議使用__all__ 標注可供外部直接使用的函式
2. 涉及到IO操作的,注意物件IO物件的關閉,可能的話建議了解是否可用 with
with open("hello.txt") as fr:
for line in fr:
pass
網路請求包:requests,urllib等sockets連接相關,因記憶體管理存在,解構式可能被無線延長,在大并發高頻次網路請求時,會產生嚴重的記憶體泄漏
3. 建議使用 TODO 為專案代碼添加臨時注釋
三、 工程:
1. 函式:Python是一門動態語言,很多時候我們可能不清楚函式引數型別或者回傳值型別,可以通過 typing (Python3.5 之后內置方法,目前可能僅有Pycharm支持typing檢查)標注入參,回傳值型別,提高可讀性
- 注釋:
- 入參(:param):
- 回傳值(:return)
如下:使用基本型別與 typing型別標注配合,提高專案可讀性,IDE中擁有型別提示,不影響代碼的使用:https://docs.python.org/zh-cn/3.6/library/typing.html
from typing import List, Mapping, Optional
# 基礎函式定義標注
def func_merge(a: List[int], b: List[int or str], c: List) -> List[int or str]:
"""
實作串列合并,產生新的串列
:param a: 串列a
:param b: 串列b
:param c: 串列c
:return: 生成新的串列
"""
return a + b + c
func_merge(1, 2, 0) # Pycharm 上會變黃有提示: Expected type 'list', got 'int' instead
func_merge([1], [2], [0])
# 回呼函式定義標注
def do(a: int):
return str(a)
def run_callback(num: int, cb: Callable[[int], str]) -> str:
return cb(num)
print(run_callback(123456, do))
print(run_callback("a", do)) # 變黃
# 可變引數定義標注
def foo(arg: Optional[int] = 0) -> None:
print("arg:", arg)
# foo(arg="a") # 以不正確形式
# foo(arg=1)
foo()
# 變數定義標注
conf: Mapping[str, str]
conf = {"REDIS": 12323}
2. http api 介面建議采用restful風格:
- 介面功能單一
- 視圖函式,建議以類形式進行處理,django/flask的views,或者restful 的Resource:
- 方法功能明確:get/post/put/delete
- 方法,功能可聚合
- 結構繼承
- 請求:資源層次化,利于閱讀與網關權限控制
-
回應:
{
"code": 0, # 0, 介面預期回應,非0:例外回應
"data": {}, # 回傳具體結果詳情
"message": "", # 回應描述
"desc": "", # desc 介面功能描述
"time": "" # 回傳回應時間
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302648.html
標籤:其他
上一篇:Spring Boot入門
