Python 基礎編碼風格
一、 基礎風格:遵循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": "" # 返回響應時間
}

浙公網安備 33010602011771號