入門文章:
開始閱讀原始碼時,先對框架的模組及其關係有一個整體的認識。我們要對框架專案的模組和目錄要有一個全盤的瞭解,要知道每個模組是幹嘛的,然後要了解模組與模組之間的關係。
分析原始碼先從父類或父介面開始分析。因為父類或者父介面往往代表了一類功能,這些基類或基類介面往往抽象了各個具體子類共有的屬性和行為,一些比較基礎的方法都在父類中實現,然後留個模板方法給子類去實現即可(模板方法的應用)。
閱讀原始碼前首先要找到啟動類。閱讀分析原始碼時要先從啟動類開始,因此找到框架啟動的入口很重要。
閱讀原始碼時要分清主幹和枝節程式碼。找到啟動入口後,然後就可以順著啟動入口一步一步除錯來閱讀原始碼了。不過在初次除錯原始碼時值得注意的是一定要分清主次程式碼,即要先閱讀主幹程式碼,其他枝枝節節的程式碼沒明白的可以放一邊。切忌一開始就深入細節然後出不來了,這樣就會造成只見冰山一角而看不到全貌的感覺。
閱讀原始碼前要分清主次模組。即閱讀分析原始碼不能漫無目的,全盤通讀,我們要從我們平時有用到的模組開始分析。每個人的時間都很寶貴,我們要把時間花在刀刃上。比如SpringBoot增加的新特性中有 自動配置 ,而自動配置特性又非常重要,因此可以挑選自動配置來進行原始碼分析。
要充分利用原始碼專案的測試類。之前也說過,一個框架之所以能流行,必定是經過大量測試的。因此如果我們想具體瞭解某個類和某個方法,我們可以充分利用這些測試類來輔助我們原始碼分析。
要學會一些除錯技巧。這一點也很重要,比如在除錯過程中如何檢視呼叫關係等等
https://medium.com/starbugs/開源專案讀起來-聽說可以幫你保管資料再決定要不要更新的-swr-d02dadc1116b
带着目的去看源码,我们只有带着问题出发的时候,才会具有更高的效率。
閱讀開源專案的目的是,找到我想知道的某個功能是如何實現的!
以react SWR 為例子
專案的出口處
這裡指的出口處就是整個專案究竟是在哪裡將我們要使用的功能 export,而專案的 export 也會是我們在使用時所 import 的東西。
https://www.itread01.com/content/1546367941.html
教你閱讀Python開源專案程式碼
閱讀Python開源專案程式碼主要有如下三個原因:
推薦專案
前2個是公認的Python領域程式碼寫的最好的、最有創意的工程師。
初學者推薦閱讀專案
初學者可以先閱讀一些程式碼量比較少的,最好是單檔案的專案:
看程式碼主要是瞭解別人寫程式碼的方式,語法實踐這些內容。看完之後,你可以針對這些專案能解決的問題自己寫個專案,寫完之後和上述專案去對比一下,看看哪些方面做的不好。
進階閱讀專案
進階的時候就要閱讀一些相對複雜的專案,它們能幫助你提升Python程式設計技巧:
pallets/werkzeug。flask的WSGI工具集。其中包含了實現非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。
bottlepy/bottle。閱讀一個Web框架對Web開發就會有更深刻的理解,flask太大,bottle就4k多行,當然如果你有毅力和興趣直接看flask是最好了的。
pallets/click。click已經內置於在flask 0.11裡,提供命令列功能,值得閱讀。
除此之外Web開發者可以閱讀一些相關的專案:
當然,2個學習flask重要的資源必須爆一爆:
500lines
推薦一個非常厲害的專案 GitHub - aosabook/500lines: 500 Lines or Less, 它裡面包含了22個由該領域的專家完成,用不到500行的程式碼實現一個特定功能的子專案。連Guido van Rossum都親自來寫基於asyncio爬蟲了,Nick Coghlan、ajdavis也出場了。更具體的介紹可以看Python 的練手專案有哪些值得推薦? - 小小搬運工的回答。
怎麼閱讀開源專案原始碼
貢獻開源專案:
python
2.1 先查收這份指南:python-guide
專案地址:https://github.com/realpython/python-guide
線上閱讀:https://pythonguidecn.readthedocs.io/zh/latest/
2.2 再翻爛這本祕籍:python3-cookbook
專案地址:https://github.com/yidao620c/python3-cookbook
線上閱讀:https://python3-cookbook.readthedocs.io/zh_CN/latest/
最早的時候,我的專案都是在根專案中,寫的程式碼都是在根專案的views.py中,很快這個檔案就超過2k行,每次開啟需要等一會。就連Pycharm某些外掛都罷工了(大於1000行的檔案出於執行效率問題會忽略)😹。
通過自己一段時間的摸索和檢視開源專案等總結,以下結構對我來說比較適合。
專案結構
├── README.md # 說明檔案
├── apps # 子專案目錄
│ ├── README.md - # 專案規範說明檔案
│ ├── app1 - # 自定義模組一
│ ├── app2 - # 自定義模組二
│ ├── ... - # 更多自定義模組,每個模組一個資料夾
│ └── user - # 使用者模組(單獨抽離出)
├── main # 專案主目錄
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py # 主配置檔案
│ ├── urls.py # 請求URL主入口
│ └── wsgi.py
├── db.sqlite3 # 自帶資料庫(僅開發環境)
├── env # 不同環境的配置檔案
│ ├── README.md - # 環境配置說明
│ ├── env.example - # 配置示例檔案
│ └── env - # 環境配置檔案
├── logs # 日誌
│ ├── access.log - # 訪問日誌
│ ├── error.log - # 錯誤日誌
│ └── uwsgi.log - # 執行日誌
├── manage.py
├── reload # (uwsgi) 監聽該檔案變動重啟服務
├── requirements.txt # 專案依賴
├── static # 靜態資原始檔
│ ├── css
│ ├── image
│ └── js
└── uwsgi.ini # uwsgi配置檔案