如何學習Python開源項目代碼

閱讀Python開源項目代碼主要有以下三個緣由:python

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

2. 對某些項目或者方向很是感興趣,但願深刻。程序員

3. 學習遇到瓶頸須要汲取開源項目的經驗和用法來作提升。github

沒有目的的閱讀開源項目就是耍流氓。浪費了時間,可是能學到的東西也不多。怎麼樣根據自身狀況去閱讀呢?web

1. 和興趣以及工做契合。舉個例子,工做中沒有機會用到Celery又不是想本身造個輪子,讀它的源碼作什麼?因此要從平時能接觸到的那些項目中選取。好比我,我確定不去看Django的代碼,由於平常工做基本遇不到,遇到了現翻就行了。sql

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

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

4. 清楚本身看代碼的目的。就是你看代碼是想了解人家怎麼設計、調試BUG、仍是隻是想學習正確的編程用法呢?其實沒有必要細摳每一個代碼細節,有時候當黑盒看,知道輸入輸出就能夠了。flask

我我的的喜愛

和工做中看別人代碼差很少,基本每一個人、每一個項目、每一個團隊都有本身寫代碼的風格,好比變量命名風格、某些語言特性使用方式、代碼規範要求、目錄風格等,其實開源項目的做者也是同樣。看代碼,如看人(團隊)。 首先介紹下個人喜愛(排名分前後):設計模式

1. kennethreitz。requests和python-guide做者。他還有一個很是勵志的故事,有興趣的能夠看 誰說程序員不是潛力股?

2. mitsuhiko。flask、Jinja二、werkzeug和flask-sqlalchemy做者。

3. sigmavirus24。flake八、pycodestyle(原pep8)、requests、urllib3等項目的主要貢獻者和維護者。

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

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

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

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

做者:董偉明
連接:https://zhuanlan.zhihu.com/p/22275595
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
 

初學者推薦閱讀項目

初學者能夠先閱讀一些代碼量比較少的,最好是單文件的項目:

1. GitHub - kennethreitz/pip-pop: Tools for managing requirements files.

2. GitHub - kennethreitz/envoy: Python Subprocesses for Humans™.

3. GitHub - kennethreitz/records: SQL for Humans™

4. GitHub - mitsuhiko/pluginbase: A simple but flexible plugin system for Python.

5. GitHub - mitsuhiko/pipsi: pip script installer

6. GitHub - mitsuhiko/unp: Unpacks things.

7. GitHub - chrisallenlane/cheat

8. GitHub - jek/blinker: A fast Python in-process signal/event dispatching system.

9. GitHub - mitsuhiko/platter: A useful helper for wheel deployments.

10. GitHub - kennethreitz/tablib: Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.

看代碼主要是瞭解別人寫代碼的方式,語法實踐這些內容。看完以後,你能夠針對這些項目能解決的問題本身寫個項目,寫完以後和上述項目去對比一下,看看哪些方面作的很差。
 

進階閱讀項目

進階的時候就要閱讀一些相對複雜的項目,它們能幫助你提高Python編程技巧:

1. faif/python-patterns。使用Python實現一些設計模式的例子。

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

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

4. msiemens/tinydb。瞭解用Python實現數據庫。

5. coleifer/peewee。瞭解ORM的實現。

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

7. mitsuhiko/flask-sqlalchemy。瞭解一個flask插件是怎麼實現的。

除此以外Web開發者能夠閱讀一些相關的項目:

1. runscope/httpbin。使用flask,網站是httpbin(1): HTTP Client Testing Service

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

3. pallets/flask-website。 flask官方網站應用。

4. pypa/warehouse。若是你使用pyramid,這個新版的PYPI網站,能夠幫助你理解不少。

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

1. GitHub - realpython/discover-flask: Full Stack Web Development with 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添加新的功能、幫助改善文檔等等。不少時候你理解的其實和做者是有衝突的,不管是你說服他和被他說服,對本身的成長都是頗有幫助的。

相關文章
相關標籤/搜索