這篇文章主要介紹如何閱讀Python開(kāi)源項(xiàng)目會(huì)更好,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需開(kāi)發(fā),是成都網(wǎng)站營(yíng)銷公司,為假山制作提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站制作熱線:028-86922220
閱讀Python開(kāi)源項(xiàng)目代碼主要有如下三個(gè)原因:
1. 在工作過(guò)程中遇到一些問(wèn)題,Google和StackOverFlow等網(wǎng)站找不到解決辦法,只能去翻源碼。
2. 對(duì)某些項(xiàng)目或者方向非常感興趣,希望深入。
3. 學(xué)習(xí)遇到瓶頸需要汲取開(kāi)源項(xiàng)目的經(jīng)驗(yàn)和用法來(lái)做提高。
沒(méi)有目的的閱讀開(kāi)源項(xiàng)目就是耍流氓。浪費(fèi)了時(shí)間,但是能學(xué)到的東西也很少。怎么樣根據(jù)自身情況去閱讀呢?
1. 和興趣以及工作契合。舉個(gè)例子,工作中沒(méi)有機(jī)會(huì)用到Celery又不是想自己造個(gè)輪子,讀它的源碼做什么?所以要從平時(shí)能接觸到的那些項(xiàng)目中選取。比如我,我肯定不去看Django的代碼,因?yàn)槿粘9ぷ骰居霾坏?,遇到了現(xiàn)翻就好了。
2. 一個(gè)方向只看一兩個(gè)典型的就可以了。比如Web框架,我只看過(guò)Bottle和Flask的源碼(其實(shí)之前也看過(guò)Django的,只是淺嘗輒止),而且看Bottle已經(jīng)是好幾年前的事情了。并不是堆的多了更好,有時(shí)候反而選擇太多會(huì)懵。
3. 不同技術(shù)階段的選擇代碼量、復(fù)雜度不一樣的項(xiàng)目,下面會(huì)具體推薦。
4. 清楚自己看代碼的目的。就是你看代碼是想了解人家怎么設(shè)計(jì)、調(diào)試BUG、還是只是想學(xué)習(xí)正確的編程用法呢?其實(shí)沒(méi)有必要細(xì)摳每個(gè)代碼細(xì)節(jié),有時(shí)候當(dāng)黑盒看,知道輸入輸出就可以了。
我的喜好
和工作中看別人代碼差不多,基本每個(gè)人、每個(gè)項(xiàng)目、每個(gè)團(tuán)隊(duì)都有自己寫代碼的風(fēng)格,比如變量命名風(fēng)格、某些語(yǔ)言特性使用方式、代碼規(guī)范要求、目錄風(fēng)格等,其實(shí)開(kāi)源項(xiàng)目的作者也是一樣。看代碼,如看人(團(tuán)隊(duì))。 首先介紹下我的喜好(排名分先后):
1. kennethreitz。requests和python-guide作者。他還有一個(gè)非常勵(lì)志的故事,有興趣的可以看 誰(shuí)說(shuō)程序員不是潛力股?
2. mitsuhiko。flask、Jinja2、werkzeug和flask-sqlalchemy作者。
3. sigmavirus24。flake8、pycodestyle(原pep8)、requests、urllib3等項(xiàng)目的主要貢獻(xiàn)者和維護(hù)者。
4. ask。Celery及相關(guān)依賴的作者。
5. ajdavis。mongo-python-driver(pymongo)、tornado等項(xiàng)目的主要貢獻(xiàn)者。
6. bitprophet。fabric、paramiko(Python的ssh庫(kù))作者。
前2個(gè)是公認(rèn)的Python領(lǐng)域代碼寫的最好的、最有創(chuàng)意的工程師。
初學(xué)者推薦閱讀項(xiàng)目
初學(xué)者可以先閱讀一些代碼量比較少的,最好是單文件的項(xiàng)目:
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.
看代碼主要是了解別人寫代碼的方式,語(yǔ)法實(shí)踐這些內(nèi)容。看完之后,你可以針對(duì)這些項(xiàng)目能解決的問(wèn)題自己寫個(gè)項(xiàng)目,寫完之后和上述項(xiàng)目去對(duì)比一下,看看哪些方面做的不好。
進(jìn)階閱讀項(xiàng)目
進(jìn)階的時(shí)候就要閱讀一些相對(duì)復(fù)雜的項(xiàng)目,它們能幫助你提升Python編程技巧:
1. faif/python-patterns。使用Python實(shí)現(xiàn)一些設(shè)計(jì)模式的例子。
2. pallets/werkzeug。flask的WSGI工具集。其中包含了實(shí)現(xiàn)非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。
3. bottlepy/bottle。閱讀一個(gè)Web框架對(duì)Web開(kāi)發(fā)就會(huì)有更深刻的理解,flask太大,bottle就4k多行,當(dāng)然如果你有毅力和興趣直接看flask是最好了的。
4. msiemens/tinydb。了解用Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)。
5. coleifer/peewee。了解ORM的實(shí)現(xiàn)。
6. pallets/click。click已經(jīng)內(nèi)置于在flask 0.11里,提供命令行功能,值得閱讀。
7. mitsuhiko/flask-sqlalchemy。了解一個(gè)flask插件是怎么實(shí)現(xiàn)的。
除此之外Web開(kāi)發(fā)者可以閱讀一些相關(guān)的項(xiàng)目:
1. runscope/httpbin。使用flask,網(wǎng)站是httpbin(1): HTTP Client Testing Service。
2. jahaja/psdash。使用flask和psutils的獲取Linux系統(tǒng)信息的面板應(yīng)用。
3. pallets/flask-website。 flask官方網(wǎng)站應(yīng)用。
4. pypa/warehouse。如果你使用pyramid,這個(gè)新版的PYPI網(wǎng)站,可以幫助你理解很多。
當(dāng)然,2個(gè)學(xué)習(xí)flask重要的資源必須爆一爆:
1. GitHub - realpython/discover-flask: Full Stack Web Development with Flask。
2. The Flask Mega-Tutorial。 這個(gè)就是《Flask Web開(kāi)發(fā):基于Python的Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》的原始博客。
500lines
推薦一個(gè)非常厲害的項(xiàng)目 GitHub - aosabook/500lines: 500 Lines or Less, 它里面包含了22個(gè)由該領(lǐng)域的專家完成,用不到500行的代碼實(shí)現(xiàn)一個(gè)特定功能的子項(xiàng)目。連Guido van Rossum都親自來(lái)寫基于asyncio爬蟲了,Nick Coghlan、ajdavis也出場(chǎng)了。
怎么閱讀開(kāi)源項(xiàng)目源碼
我基于個(gè)人興趣和日常開(kāi)發(fā)需要閱讀過(guò)一些開(kāi)源項(xiàng)目,我列一些比較通用的經(jīng)驗(yàn)和感悟:
1. 不要畏懼。我發(fā)現(xiàn)大家都經(jīng)常會(huì)感嘆XXX強(qiáng)大,YYY流行,無(wú)形中你會(huì)把它放在一個(gè)不可觸及到的地位,感覺(jué)它很難,而令自己不敢去挑戰(zhàn)它。其實(shí)是人就會(huì)產(chǎn)出bug,假如你發(fā)現(xiàn)它有問(wèn)題,就應(yīng)該抓住機(jī)會(huì)去驗(yàn)證它。這個(gè)過(guò)程中,它的神秘感也就消失了,有過(guò)這么幾次經(jīng)驗(yàn)?zāi)憔陀行判牧?。其次是不要怕你提交的PR被拒絕。這是非常正常的,我有很多PR是被拒絕的,尤其是給標(biāo)準(zhǔn)庫(kù)提交的Patch,絕大多數(shù)都被拒絕了。
2. 帶著問(wèn)題去閱讀代碼,這也是我認(rèn)為最有效的方式。這會(huì)讓你在閱讀時(shí)候有個(gè)主線,比較有針對(duì)性。
3. 斷點(diǎn)調(diào)試。在Python代碼中使用pdb一般不太好使,因?yàn)榇a復(fù)雜的話,這種斷點(diǎn)需要你使用多個(gè)n跳到對(duì)應(yīng)的位置,我一般都是先拋出異常,然后使用pdb的up/down/n等命令調(diào)試。當(dāng)然在目標(biāo)位置添加一些print日志或注釋部分代碼然后直接使用exit()退出也是可以的。
4. 善用文檔,官網(wǎng)例子。閱讀一個(gè)項(xiàng)目一開(kāi)始會(huì)有點(diǎn)無(wú)從下手,那么就先好好這些內(nèi)容,它們一般都是作者表達(dá)這個(gè)項(xiàng)目的第一個(gè)入口。quickstart、tutorial等內(nèi)容中的最小化的例子其實(shí)就是最好的閱讀入口,先去看這些引用的模塊和調(diào)用的對(duì)應(yīng)方法或者函數(shù)的對(duì)應(yīng)實(shí)現(xiàn),從下至上去閱讀。
5. 理解作者的思考方式。不同的項(xiàng)目要有不同的思考方式來(lái)閱讀,不要擰著自己的習(xí)慣去閱讀,這樣會(huì)很累,得嘗試接受別人的觀點(diǎn),甚至于改變自己。
6. 閱讀項(xiàng)目的早期版本。一些項(xiàng)目隨著時(shí)間演進(jìn)已經(jīng)非常復(fù)雜了,讀起來(lái)有難度,那么你可以回到項(xiàng)目的早期版本上,先去看相對(duì)簡(jiǎn)單地版本,然后設(shè)置幾個(gè)時(shí)間點(diǎn)或者版本節(jié)點(diǎn),漸進(jìn)的來(lái)閱讀。
7. 記憶并繪制項(xiàng)目架構(gòu)。項(xiàng)目就是一堆代碼的組合,除了學(xué)習(xí)編程技巧,還要了解項(xiàng)目的架構(gòu)決策,這對(duì)于未來(lái)自己寫大型項(xiàng)目非常用用。這種理解越補(bǔ)充,你會(huì)對(duì)它就越來(lái)越清晰。
8. 參與。如果只是看和思考而不參與,其實(shí)效果大打折扣。我建議要參與一些issue討論、向作者提問(wèn)、提PR添加新的功能、幫助改善文檔等等。很多時(shí)候你理解的其實(shí)和作者是有沖突的,無(wú)論是你說(shuō)服他和被他說(shuō)服,對(duì)自己的成長(zhǎng)都是很有幫助的。
以上是如何閱讀Python開(kāi)源項(xiàng)目會(huì)更好的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!