這樣說吧:如果遵循了這8種超棒的Python編程實(shí)踐,那么你就摸準(zhǔn)了Python小機(jī)關(guān),保證了順利地做事的基本指導(dǎo)。

前言
當(dāng)你正在開發(fā)的程序出現(xiàn)錯(cuò)誤時(shí),通常很容易判斷。比如不知道從哪里冒出來的bug,像爛泥一樣運(yùn)行的代碼,笨拙的項(xiàng)目結(jié)構(gòu),這僅只是三個(gè)暴露問題的跡象。但有時(shí)候,要判斷自己做得是否正確卻不是那么容易。良好的編程習(xí)慣就像電影中最好的特效:你永遠(yuǎn)不會(huì)注意到它們的存在,因?yàn)樗鼈儚牟还_宣告自己的存在。
那么在Python中又有哪些標(biāo)志是體現(xiàn)好的編程實(shí)踐呢?如果您是這門語言的新手,并且您對(duì)良好的Python開發(fā)行為可能有一些了解,或者您只是想知道您已經(jīng)養(yǎng)成的一些習(xí)慣是否值得保留,那么我們?yōu)槟占艘唤M指導(dǎo)方針。如果您遵循下面列出的 **8個(gè)最佳實(shí)踐準(zhǔn)則 **,那么您的Python編程基本有保障了——已開啟了正確的基本模式。
1.使用虛擬環(huán)境和項(xiàng)目管理工具
即使是小型的、一次性的Python項(xiàng)目也可以通過虛擬環(huán)境和適當(dāng)?shù)捻?xiàng)目結(jié)構(gòu)從中受益。像 **Poetry **這樣的工具使安裝過程幾乎是自動(dòng)的。即使是較低的venv也可以相對(duì)直接地用虛擬環(huán)境來組建您的項(xiàng)目,并從中獲益。
版本控制是另一個(gè)重要的項(xiàng)目管理工具。如今,這通常意味著Git。即使對(duì)于簡單的單文件項(xiàng)目,也可以利用Git。您永遠(yuǎn)不知道需要回滾到某個(gè)東西的早期版本會(huì)在什么時(shí)候。大多數(shù)支持Python的ide還內(nèi)置了對(duì)venv和Git的支持,因此使用它們很容易。
2.使用Python內(nèi)建函數(shù),而不重新發(fā)明輪子
精明的Python程序員都知道利用Python的 **內(nèi)置函數(shù) **和 **標(biāo)準(zhǔn)庫 **來處理絕大多數(shù)常見用例。大多數(shù)你需要完成的例行任務(wù)——文件操作、正則表達(dá)式、使用web瀏覽器等等——都已經(jīng)在Python中有相應(yīng)交互支持實(shí)現(xiàn)。
經(jīng)驗(yàn)較少的Python開發(fā)人員常問的一個(gè)問題是,我如何知道標(biāo)準(zhǔn)庫中的內(nèi)容是否涵蓋了我的用例,而不必記住那些內(nèi)容?簡單的答案是將標(biāo)準(zhǔn)庫索引和內(nèi)置函數(shù)概覽頁面添加為書簽,并在遇到“日常編程”之類的問題時(shí)瀏覽它們。不斷接觸查看Python中可用的工具,這本身就是一個(gè)強(qiáng)大的老師。
3.使用工作所需的正確模塊
與內(nèi)置函數(shù)和標(biāo)準(zhǔn)庫一樣,使用Python的龐大的第三方模塊集合是一種節(jié)省勞力的方法。通過PyPI的web前端為您的問題啟動(dòng)一個(gè)搜索詞,您幾乎總會(huì)找到開箱即用解決方案的模塊。同樣,當(dāng)您可以找到并通過pip安裝它時(shí),為什么要重新發(fā)明(Python)輪子呢?另外,許多Python模塊具有 C語言 加速的性能,這意味著當(dāng)使用其他模塊時(shí),您可以獲得更快的開發(fā)速度和更快的程序執(zhí)行速度。
一個(gè)經(jīng)常出現(xiàn)的問題是:如果處理用例場景有多個(gè)模塊可用,我應(yīng)該使用哪一個(gè)?簡單的答案是,從使用最多或勢頭最大的項(xiàng)目開始(例如,GitHub stars或forks所顯示的),因?yàn)槟挠美苡锌赡芘c許多其他人的用例相同。
4.OOP不會(huì)讓你發(fā)瘋
面向?qū)ο缶幊?OOP)將數(shù)據(jù)結(jié)構(gòu)與用于操作它們的方法捆綁在一起,使編寫高級(jí)代碼變得更容易。對(duì)于像Python這樣的高級(jí)語言,OOP非常適合。但并不是所有的Python代碼都需要是面向?qū)ο蟮?。熟悉Python的開發(fā)人員知道,與面向?qū)ο蟮奶娲椒ㄏ啾龋?0行(甚至200行)“一步到位”(get-it-done-and-get-on-with-it)的代碼可以節(jié)省寶貴的時(shí)間,如有選擇就不要用OOP方法??偟膩碚f,大型和復(fù)雜的項(xiàng)目確實(shí)從面向?qū)ο笾惺芤妫浅琼?xiàng)目需要面向?qū)ο?,否則可以放寬規(guī)則。
5.保持測試代碼為標(biāo)準(zhǔn)行為
說到在更大的項(xiàng)目中完成的事情,明智的python開發(fā)者知道創(chuàng)建測試套件的價(jià)值。盡管編寫測試很乏味,但當(dāng)項(xiàng)目發(fā)展到一定程度的復(fù)雜性時(shí),它們是無價(jià)的。更高級(jí)的掌握能力的一個(gè)標(biāo)志是,與每個(gè)新特性并行構(gòu)建相應(yīng)測試,而不是事后構(gòu)建。實(shí)際上,越早克服編寫測試的困難,就越早開始改進(jìn)代碼。從實(shí)現(xiàn)第一個(gè)特性就開啟測試,您會(huì)得意地感覺自己編程工作溜溜的。
6.算了吧,就不要用python 2
把Python2遺忘在歷史中吧,去年是這樣,現(xiàn)在更是如此。Python 2已經(jīng)運(yùn)行了很長時(shí)間,但是它現(xiàn)在完全不受官方Python開發(fā)團(tuán)隊(duì)的支持。明智的Pythonistas已經(jīng)將他們的項(xiàng)目遷移到python3,或者現(xiàn)在正在這樣做。
7.也不要使用最新版本的Python
Python 3.8可能是Python的最新和“最棒”的版本,但這并不意味著您必須使用它。事實(shí)上,聰明的軟件開發(fā)人員明白,使用任何東西的最新版本都是碰運(yùn)氣。Python也不例外。作為一位精明的Python程序員,要堅(jiān)持在最新得到最廣泛采用前,使用其之前版本,以確保與第三方模塊最廣泛的兼容性。畢竟,利用所有已存在的這些有用模塊的能力是使用Python的首要原因之一。
8.酌情使用其他的 編程語言
幾乎在所有方面Python都被描述為“第二好的編程語言”——有時(shí)最好和第二好的之間的差距的確很大。但是作為一名明智的Python開發(fā)人員應(yīng)該知道:在眾多工具中Python也只是其中的一種,應(yīng)該始終利用正確的工具來完成手頭的工作。
對(duì)于需要最大運(yùn)行速度的應(yīng)用程序或操作,您可能不希望使用純Python,而是C或Rust,甚至Go,只要能把他玩轉(zhuǎn)。但并非所有性能密集型編程都意味著完全將Python放棄。也許它僅僅意味著使用像Numpy或Pandas這樣的基于C語言的庫,或者在Python shell中包裝C語言或兼容C語言的代碼,或者使 用Cython將Python轉(zhuǎn)換為C語言 。
9.小結(jié)
本文簡單談了下Python編程使用的8個(gè)正確行為和態(tài)度,對(duì)照一下自己是否有需要改進(jìn)的地方呢。或者你有什么想法,分享出來吧。