一篇文章帶你瞭解谷歌這些大廠是怎麼寫 python 代碼的
谷歌內部的 python 代碼規范
熟悉 python 一般都會努力遵循 pep8 規范,也會有一些公司制定內部的代碼規范。大公司制定規范的目的不是說你一定要怎樣去使用編程語言,而是讓大傢遵守同一套規則,節省其他人閱讀代碼的成本,方便協作和溝通。對於個人而言,日常編寫代碼隻需要保持風格統一,前後一致,就是一個很大的勝利,然後再加入一些實用的規則,在寫代碼的時候有效減少可能引入的 bug。
接下來,我截取瞭一些谷歌的 python 代碼規范中一些有意思的要點,希望日後能更深刻的感受到它們的用處。
1.導入模塊和包,不導入單獨的類、函數或者變量。
這通常能簡化導入過程,方便命名空間管理。但是缺點也很明顯,當名稱較長時,調用函數和類的代碼會很長,影響可讀性。
# yes from sound.effects import echo echo.EchoFilter() # no from sound.effects.echo import EchoFilter EchoFilter()
2.從根目錄導入,不假定任意的 sys.path,也不使用相對導入。
假設 doctor.who 路徑已經被某種手段添加到瞭 sys.path,也應該從開始的地方導入。
# yes from doctor.who import jodie # other than doctor.who is already in sys.path # no import jodie
3.謹慎使用異常
使用異常需要註意的細節有:
- 優先合理的使用內置異常類。比如需要正數的情況下傳遞瞭一個負數引發的錯誤,拋出 ValueError 類型。
- 永遠不要使用 except 捕獲所有的異常,這可能會造成一些隱藏 bug 難於發現。你應該使用特定異常類型分開捕獲。
- 不要使用 assert 指示某些意外情況,應該使用 raise。
- 不要在 try 和 except 子句中加入太多邏輯,try 塊的體積越大, 期望之外的異常就越容易被觸發。
盡量使用正確的內置異常類型:
def division(a, b): if b == 0: raise ValueError('b can not be zero')
避免全局捕獲異常,指定異常類型:
# yes try: 1 / 0 "abc"[100] except ZeroDivisionError: ... except IndexError: ... # no try: 1 / 0 "abc"[100] except: ...
4.不要使用可變類型作為函數默認值,如果修改瞭這個變量,默認值也會跟著發生變化。
# yes def foo(a, b=None): if b is None: b = [] def foo(a, b: Sequence = ()): # no def foo(a, b=[]): def foo(a, b=time.time()): def foo(a, b={}):
5.註意條件表達式的隱式佈爾值
- 對於序列(字符串, 列表, 元組), 要註意空序列是 False,在判斷是否為空序列時,使用隱性的 if not seq 判斷,而不用 if len(seq) == 0;
- 判斷數字是否為 0,則使用 number == 0,而不使用用 if not number。因為 number 可能設置的是默認值為 None。
- 判斷是否為 None 使用 x is None,而不用 not x。
# yes .if not users: # sequence if number == 0: if i % 10 == 0: def f(x=None): if x is None: # no if len(users) == 0: if number is not None and not number: if not i % 10: def f(x=None): x = x or []
6.謹慎使用裝飾器
裝飾器可以在函數的參數或返回值上執行任何操作,這可能導致讓人驚異的隱藏行為。而且, 裝飾器在導入時執行,從裝飾器代碼中捕獲錯誤並處理是很困難的。使用裝飾器一定要編寫單元測試,並且說明它的作用和使用方法。裝飾器本身不要依賴於任何文件, socket, 數據庫連接。避免使用 @staticmedthod 裝飾器,多數情況下,將方法封裝成模塊級的函數可以達到同樣的效果。
7.建議使用類型聲明,類型聲明的好處非常明顯:
- 使用類型聲明可以提高代碼的可讀性。
- 也可以使用類型檢查工具提早發現問題。
- 使用類型聲明之後,doc string 中就沒有必要對參數類型進行說明。
- 在編輯器中會根據類型進行代碼提示。
但是在實際操作過程中,類型聲明往往很難維持。當代碼更新完之後,一定要記得更新類型聲明,過時的類型聲明會對閱讀者造成誤導。python 的類型聲明成本學習成本較高。
# yes name: str = 'yuz' def func(a: int) -> List[int]:
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 詳解Python模塊化–模塊(Modules)和包(Packages)
- Python異常對象Exception基礎類異常捕捉
- 一文搞懂python異常處理、模塊與包
- Python常用工具之音頻調整音量
- Python基礎之模塊詳解