1. 程式人生 > >教你閱讀Python開源專案程式碼

教你閱讀Python開源專案程式碼

作者:董偉明
連結:https://zhuanlan.zhihu.com/p/22275595
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

注:本專欄文章未經允許請勿轉載。

知乎上有不少人問和關注閱讀開源專案程式碼這個問題,比如「初學 Python,有哪些 Pythonic 的原始碼推薦閱讀?」、「github中適合新人閱讀的Python專案有哪些?」、「如何去閱讀並學習一些優秀的開源框架的原始碼?」等。本文將從推薦可閱讀的Python專案和如何閱讀者2個方面聊聊這個話題。

閱讀Python開源專案程式碼主要有如下三個原因:

1. 在工作過程中遇到一些問題,Google和StackOverFlow等網站找不到解決辦法,只能去翻原始碼。

2. 對某些專案或者方向非常感興趣,希望深入。

3. 學習遇到瓶頸需要汲取開源專案的經驗和用法來做提高。

沒有目的的閱讀開源專案就是耍流氓。浪費了時間,但是能學到的東西也很少。怎麼樣根據自身情況去閱讀呢?

1. 和興趣以及工作契合。舉個例子,工作中沒有機會用到Celery又不是想自己造個輪子,讀它的原始碼做什麼?所以要從平時能接觸到的那些專案中選取。比如我,我肯定不去看Django的程式碼,因為日常工作基本遇不到,遇到了現翻就好了。

2. 一個方向只看一兩個典型的就可以了。比如Web框架,我只看過Bottle和Flask的原始碼(其實之前也看過Django的,只是淺嘗輒止),而且看Bottle已經是好幾年前的事情了。並不是堆的多了更好,有時候反而選擇太多會懵。

3. 不同技術階段的選擇程式碼量、複雜度不一樣的專案,下面會具體推薦。

4. 清楚自己看程式碼的目的。就是你看程式碼是想了解人家怎麼設計、除錯BUG、還是隻是想學習正確的程式設計用法呢?其實沒有必要細摳每個程式碼細節,有時候當黑盒看,知道輸入輸出就可以了。

我個人的喜好

和工作中看別人程式碼差不多,基本每個人、每個專案、每個團隊都有自己寫程式碼的風格,比如變數命名風格、某些語言特性使用方式、程式碼規範要求、目錄風格等,其實開源專案的作者也是一樣。看程式碼,如看人(團隊)。 首先介紹下我的喜好(排名分先後):

1. kennethreitz。requests和python-guide作者。他還有一個非常勵志的故事,有興趣的可以看

誰說程式設計師不是潛力股?

2. mitsuhiko。flask、Jinja2、werkzeug和flask-sqlalchemy作者。

3. sigmavirus24。flake8、pycodestyle(原pep8)、requests、urllib3等專案的主要貢獻者和維護者。

4. ask。Celery及相關依賴的作者。

5. ajdavis。mongo-python-driver(pymongo)、tornado等專案的主要貢獻者。

6. bitprophet。fabric、paramiko(Python的ssh庫)作者。

前2個是公認的Python領域程式碼寫的最好的、最有創意的工程師。

初學者推薦閱讀專案

初學者可以先閱讀一些程式碼量比較少的,最好是單檔案的專案:

看程式碼主要是瞭解別人寫程式碼的方式,語法實踐這些內容。看完之後,你可以針對這些專案能解決的問題自己寫個專案,寫完之後和上述專案去對比一下,看看哪些方面做的不好。

進階閱讀專案

進階的時候就要閱讀一些相對複雜的專案,它們能幫助你提升Python程式設計技巧:

2. pallets/werkzeug。flask的WSGI工具集。其中包含了實現非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。

3. bottlepy/bottle。閱讀一個Web框架對Web開發就會有更深刻的理解,flask太大,bottle就4k多行,當然如果你有毅力和興趣直接看flask是最好了的。

6. pallets/click。click已經內置於在flask 0.11裡,提供命令列功能,值得閱讀。

除此之外Web開發者可以閱讀一些相關的專案:

2. jahaja/psdash。使用flask和psutils的獲取Linux系統資訊的面板應用。

當然,2個學習flask重要的資源必須爆一爆:

2. The Flask Mega-Tutorial。 這個就是《Flask Web開發:基於Python的Web應用開發實戰》的原始部落格。

500lines

推薦一個非常厲害的專案 GitHub - aosabook/500lines: 500 Lines or Less, 它裡面包含了22個由該領域的專家完成,用不到500行的程式碼實現一個特定功能的子專案。連Guido van Rossum都親自來寫基於asyncio爬蟲了,Nick Coghlan、ajdavis也出場了。更具體的介紹可以看Python 的練手專案有哪些值得推薦? - 小小搬運工的回答


怎麼閱讀開源專案原始碼

我基於個人興趣和日常開發需要閱讀過一些開源專案,我列一些比較通用的經驗和感悟:

1. 不要畏懼。我發現大家都經常會感嘆XXX強大,YYY流行,無形中你會把它放在一個不可觸及到的地位,感覺它很難,而令自己不敢去挑戰它。其實是人就會產出bug,假如你發現它有問題,就應該抓住機會去驗證它。這個過程中,它的神祕感也就消失了,有過這麼幾次經驗你就有信心了。其次是不要怕你提交的PR被拒絕。這是非常正常的,我有很多PR是被拒絕的,尤其是給標準庫提交的Patch,絕大多數都被拒絕了。

2. 帶著問題去閱讀程式碼,這也是我認為最有效的方式。這會讓你在閱讀時候有個主線,比較有針對性。

3. 斷點除錯。在Python程式碼中使用pdb一般不太好使,因為程式碼複雜的話,這種斷點需要你使用多個n跳到對應的位置,我一般都是先丟擲異常,然後使用pdb的up/down/n等命令除錯。當然在目標位置新增一些print日誌或註釋部分程式碼然後直接使用exit()退出也是可以的。

4. 善用文件,官網例子。閱讀一個專案一開始會有點無從下手,那麼就先好好這些內容,它們一般都是作者表達這個專案的第一個入口。quickstart、tutorial等內容中的最小化的例子其實就是最好的閱讀入口,先去看這些引用的模組和呼叫的對應方法或者函式的對應實現,從下至上去閱讀。

5. 理解作者的思考方式。不同的專案要有不同的思考方式來閱讀,不要擰著自己的習慣去閱讀,這樣會很累,得嘗試接受別人的觀點,甚至於改變自己。

6. 閱讀專案的早期版本。一些專案隨著時間演進已經非常複雜了,讀起來有難度,那麼你可以回到專案的早期版本上,先去看相對簡單地版本,然後設定幾個時間點或者版本節點,漸進的來閱讀。

7. 記憶並繪製專案架構。專案就是一堆程式碼的組合,除了學習程式設計技巧,還要了解專案的架構決策,這對於未來自己寫大型專案非常用用。這種理解越補充,你會對它就越來越清晰。

8. 參與。如果只是看和思考而不參與,其實效果大打折扣。我建議要參與一些issue討論、向作者提問、提PR新增新的功能、幫助改善文件等等。很多時候你理解的其實和作者是有衝突的,無論是你說服他和被他說服,對自己的成長都是很有幫助的。




正文完

----------------------------------------------------------------------------------------------------------

歡迎加入QQ群121435120,或者WEB上掃碼進QQ群: