一篇文章帶你了解谷歌這些大廠是怎么寫 python 代碼的
谷歌內(nèi)部的 python 代碼規(guī)范
熟悉 python 一般都會(huì)努力遵循 pep8 規(guī)范,也會(huì)有一些公司制定內(nèi)部的代碼規(guī)范。大公司制定規(guī)范的目的不是說(shuō)你一定要怎樣去使用編程語(yǔ)言,而是讓大家遵守同一套規(guī)則,節(jié)省其他人閱讀代碼的成本,方便協(xié)作和溝通。對(duì)于個(gè)人而言,日常編寫代碼只需要保持風(fēng)格統(tǒng)一,前后一致,就是一個(gè)很大的勝利,然后再加入一些實(shí)用的規(guī)則,在寫代碼的時(shí)候有效減少可能引入的 bug。
接下來(lái),我截取了一些谷歌的 python 代碼規(guī)范中一些有意思的要點(diǎn),希望日后能更深刻的感受到它們的用處。
1.導(dǎo)入模塊和包,不導(dǎo)入單獨(dú)的類、函數(shù)或者變量。
這通常能簡(jiǎn)化導(dǎo)入過(guò)程,方便命名空間管理。但是缺點(diǎn)也很明顯,當(dāng)名稱較長(zhǎng)時(shí),調(diào)用函數(shù)和類的代碼會(huì)很長(zhǎng),影響可讀性。
# yes from sound.effects import echo echo.EchoFilter() # no from sound.effects.echo import EchoFilter EchoFilter()
2.從根目錄導(dǎo)入,不假定任意的 sys.path,也不使用相對(duì)導(dǎo)入。
假設(shè) doctor.who 路徑已經(jīng)被某種手段添加到了 sys.path,也應(yīng)該從開(kāi)始的地方導(dǎo)入。
# yes from doctor.who import jodie # other than doctor.who is already in sys.path # no import jodie
3.謹(jǐn)慎使用異常
使用異常需要注意的細(xì)節(jié)有:
- 優(yōu)先合理的使用內(nèi)置異常類。比如需要正數(shù)的情況下傳遞了一個(gè)負(fù)數(shù)引發(fā)的錯(cuò)誤,拋出 ValueError 類型。
- 永遠(yuǎn)不要使用 except 捕獲所有的異常,這可能會(huì)造成一些隱藏 bug 難于發(fā)現(xiàn)。你應(yīng)該使用特定異常類型分開(kāi)捕獲。
- 不要使用 assert 指示某些意外情況,應(yīng)該使用 raise。
- 不要在 try 和 except 子句中加入太多邏輯,try 塊的體積越大, 期望之外的異常就越容易被觸發(fā)。
盡量使用正確的內(nèi)置異常類型:
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.不要使用可變類型作為函數(shù)默認(rèn)值,如果修改了這個(gè)變量,默認(rèn)值也會(huì)跟著發(fā)生變化。
# 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.注意條件表達(dá)式的隱式布爾值
- 對(duì)于序列(字符串, 列表, 元組), 要注意空序列是 False,在判斷是否為空序列時(shí),使用隱性的 if not seq 判斷,而不用 if len(seq) == 0;
- 判斷數(shù)字是否為 0,則使用 number == 0,而不使用用 if not number。因?yàn)?number 可能設(shè)置的是默認(rèn)值為 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.謹(jǐn)慎使用裝飾器
裝飾器可以在函數(shù)的參數(shù)或返回值上執(zhí)行任何操作,這可能導(dǎo)致讓人驚異的隱藏行為。而且, 裝飾器在導(dǎo)入時(shí)執(zhí)行,從裝飾器代碼中捕獲錯(cuò)誤并處理是很困難的。使用裝飾器一定要編寫單元測(cè)試,并且說(shuō)明它的作用和使用方法。裝飾器本身不要依賴于任何文件, socket, 數(shù)據(jù)庫(kù)連接。避免使用 @staticmedthod 裝飾器,多數(shù)情況下,將方法封裝成模塊級(jí)的函數(shù)可以達(dá)到同樣的效果。
7.建議使用類型聲明,類型聲明的好處非常明顯:
- 使用類型聲明可以提高代碼的可讀性。
- 也可以使用類型檢查工具提早發(fā)現(xiàn)問(wèn)題。
- 使用類型聲明之后,doc string 中就沒(méi)有必要對(duì)參數(shù)類型進(jìn)行說(shuō)明。
- 在編輯器中會(huì)根據(jù)類型進(jìn)行代碼提示。
但是在實(shí)際操作過(guò)程中,類型聲明往往很難維持。當(dāng)代碼更新完之后,一定要記得更新類型聲明,過(guò)時(shí)的類型聲明會(huì)對(duì)閱讀者造成誤導(dǎo)。python 的類型聲明成本學(xué)習(xí)成本較高。
# yes name: str = 'yuz' def func(a: int) -> List[int]:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python+PyQt5實(shí)現(xiàn)自動(dòng)點(diǎn)擊神器
這篇文章主要為大家詳細(xì)介紹了如何利用Python和PyQt5實(shí)現(xiàn)自動(dòng)點(diǎn)擊神器,旨在解決重復(fù)性的點(diǎn)擊工作,解放雙手,具有及時(shí)性和準(zhǔn)確性,需要的可以參考下2024-01-01使用Python腳本對(duì)GiteePages進(jìn)行一鍵部署的使用說(shuō)明
剛好之前有了解過(guò)python的自動(dòng)化,就想著自動(dòng)化腳本,百度一搜還真有類似的文章。今天就給大家分享下使用Python腳本對(duì)GiteePages進(jìn)行一鍵部署的使用說(shuō)明,感興趣的朋友一起看看吧2021-05-05如何通過(guò)Flask的request對(duì)象獲取url
這篇文章主要介紹了如何通過(guò)Flask的request對(duì)象獲取url問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07python模擬實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python模擬實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python django框架 web端視頻加密的實(shí)例詳解
這篇文章主要介紹了Python django框架 web端視頻加密,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Pandas DataFrame數(shù)據(jù)存儲(chǔ)格式比較分析
Pandas 支持多種存儲(chǔ)格式,在本文中將對(duì)不同類型存儲(chǔ)格式下的Pandas Dataframe的讀取速度、寫入速度和大小的進(jìn)行測(cè)試對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-09-09關(guān)于不懂Chromedriver如何配置環(huán)境變量問(wèn)題解決方法
這篇文章主要介紹了關(guān)于不懂Chromedriver如何配置環(huán)境變量問(wèn)題解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06