這是一本介紹如何實(shí)現(xiàn)Python代碼整潔的書,主要介紹如何使用Python 3.9引入的新特性提升編碼技能。此外,本書還介紹了以下內(nèi)容:通過利用自動化工具建立高效的開發(fā)環(huán)境,利用Python中的魔法方法來編寫更好的代碼,抽象代碼復(fù)雜性并封裝細(xì)節(jié),使用Python特有的特性創(chuàng)建高級的面向?qū)ο笤O(shè)計(jì),通過使用面向?qū)ο笤O(shè)計(jì)的軟件工程原則創(chuàng)建強(qiáng)大的抽象來消除代碼重復(fù),使用裝飾器和描述符創(chuàng)建特定于Python的解決方案,運(yùn)用單元測試方法有效重構(gòu)代碼,以及通過實(shí)現(xiàn)整潔的代碼庫為構(gòu)建堅(jiān)實(shí)的架構(gòu)打下基礎(chǔ)等。
本書對新手程序員和有經(jīng)驗(yàn)的程序員同樣適用,也適合想通過編寫Python代碼來節(jié)省成本和提高效率的團(tuán)隊(duì)領(lǐng)導(dǎo)、軟件架構(gòu)師和高級軟件工程師參考。當(dāng)然在閱讀本書前,讀者應(yīng)掌握一些Python基礎(chǔ)知識。
1. 介紹實(shí)現(xiàn)Python代碼整潔應(yīng)遵循的基本原則
2. 涵蓋避免由不良代碼導(dǎo)致的效率低下以及存在諸多隱患的代碼的方法
3. 作者M(jìn)ariano Anaya,軟件工程師,專業(yè)背景深厚,項(xiàng)目經(jīng)驗(yàn)豐富
4. 基于新的Python 3.9,方便讀者學(xué)習(xí)
Mariano Anaya 專注于軟件開發(fā)和指導(dǎo)同行的軟件工程師;感興趣的主要領(lǐng)域包括軟件架構(gòu)、函數(shù)式編程和分布式系統(tǒng);曾在 2016 年和 2017 年度歐洲 Python 大會及
2019 年度歐洲開源開發(fā)者會議(FOSDEM)上發(fā)表過演講。更詳細(xì)的信息請?jiān)L問其 GitHub賬戶(用戶名為 rmariano)。
第 1章 簡介、代碼格式設(shè)置和工具 1
1.1 簡介 1
1.1.1 整潔代碼的含義 2
1.1.2 整潔代碼的重要性 2
1.1.3 一些例外情況 4
1.2 設(shè)置代碼的格式 4
1.3 文檔 7
1.3.1 代碼注釋 7
1.3.2 文檔字符串 8
1.3.3 注解 10
1.3.4 注解是否會取代文檔字符串 13
1.4 配置和使用工具 15
1.4.1 類型一致性檢查 15
1.4.2 一般性代碼驗(yàn)證 17
1.4.3 自動設(shè)置格式 18
1.4.4 自動檢查設(shè)置 20
1.5 小結(jié) 21
1.6 參考資料 22
第 2章 符合Python語言習(xí)慣的代碼 23
2.1 索引和切片 24
2.2 上下文管理器 26
2.3 推導(dǎo)式和賦值表達(dá)式 31
2.4 對象的特性、屬性及各種方法 34
2.4.1 Python中的下劃線 34
2.4.2 特性 36
2.4.3 使用更緊湊的語法創(chuàng)建類 38
2.4.4 可迭代對象 41
2.4.5 容器對象 46
2.4.6 對象的動態(tài)屬性 47
2.4.7 可調(diào)用對象 49
2.4.8 魔法方法小結(jié) 50
2.5 Python注意事項(xiàng) 51
2.5.1 可變的默認(rèn)參數(shù) 51
2.5.2 擴(kuò)展內(nèi)置類型 52
2.6 異步代碼簡介 54
2.7 小結(jié) 56
2.8 參考資料 56
第3章 優(yōu)質(zhì)代碼的通用特征 57
3.1 契約式設(shè)計(jì) 58
3.1.1 前置條件 59
3.1.2 后置條件 60
3.1.3 Python契約 60
3.1.4 契約式設(shè)計(jì)小結(jié) 60
3.2 防御式編程 61
3.2.1 錯(cuò)誤處理 61
3.2.2 在Python中使用斷言 69
3.3 關(guān)注點(diǎn)分離 70
3.4 常見縮略語 71
3.4.1 DRY/OAOO 72
3.4.2 YAGNI 73
3.4.3 KIS 74
3.4.4 EAFP/LBYL 76
3.5 Python中的繼承 77
3.5.1 什么情況下使用繼承是個(gè)好主意 77
3.5.2 反模式的繼承 78
3.5.3 Python中的多繼承 81
3.6 函數(shù)和方法中的參數(shù) 83
3.6.1 Python中函數(shù)參數(shù)的工作原理 84
3.6.2 函數(shù)的參數(shù)數(shù)量 91
3.7 有關(guān)軟件設(shè)計(jì)最佳實(shí)踐的最后說明 94
3.7.1 軟件中的正交性 94
3.7.2 結(jié)構(gòu)化代碼 95
3.8 小結(jié) 96
3.9 參考資料 97
第4章 SOLID原則 98
4.1 單一職責(zé)原則 98
4.1.1 一個(gè)職責(zé)過多的類 99
4.1.2 分配職責(zé) 100
4.2 開/閉原則 101
4.2.1 因未遵循OCP而帶來可維護(hù)性問題的示例 102
4.2.2 重構(gòu)事件系統(tǒng)以提高可擴(kuò)展性 104
4.2.3 擴(kuò)展事件系統(tǒng) 106
4.2.4 OCP小結(jié) 107
4.3 里氏替換原則 108
4.3.1 使用工具找出LSP問題 109
4.3.2 更微妙的LSP違反情形 111
4.3.3 LSP小結(jié) 113
4.4 接口分離 114
4.4.1 一個(gè)提供了太多功能的接口 115
4.4.2 接口越小越好 115
4.4.3 接口應(yīng)多小 117
4.5 依賴倒置 117
4.5.1 一個(gè)剛性依賴案例 118
4.5.2 倒置依賴 118
4.5.3 依賴注入 119
4.6 小結(jié) 121
4.7 參考資料 122
第5章 使用裝飾器改善代碼 123
5.1 Python裝飾器是什么 123
5.1.1 函數(shù)裝飾器 124
5.1.2 類裝飾器 125
5.1.3 其他類型的裝飾器 129
5.2 高級裝飾器 129
5.2.1 向裝飾器傳遞參數(shù) 129
5.2.2 指定了參數(shù)默認(rèn)值的裝飾器 133
5.2.3 協(xié)程裝飾器 135
5.2.4 擴(kuò)展的裝飾器語法 137
5.3 充分利用裝飾器 138
5.3.1 調(diào)整函數(shù)的簽名 139
5.3.2 驗(yàn)證參數(shù) 140
5.3.3 跟蹤代碼 140
5.4 有效的裝飾器:避免常見錯(cuò)誤 140
5.4.1 保留被包裝的原始對象的數(shù)據(jù) 140
5.4.2 在裝飾器中處理副作用 143
5.4.3 創(chuàng)建在任何情況下都管用的裝飾器 146
5.5 裝飾器與整潔的代碼 149
5.5.1 組合勝過繼承 149
5.5.2 DRY原則與裝飾器 152
5.5.3 裝飾器與關(guān)注點(diǎn)分離 153
5.5.4 分析優(yōu)良的裝飾器 154
5.6 小結(jié) 155
5.7 參考資料 156
第6章 使用描述符更充分地利用對象 157
6.1 初識描述符 157
6.1.1 描述符背后的機(jī)制 157
6.1.2 探討描述符協(xié)議中的各個(gè)方法 160
6.2 描述符類型 167
6.2.1 非數(shù)據(jù)描述符 167
6.2.2 數(shù)據(jù)描述符 169
6.3 使用描述符 171
6.3.1 描述符的一種用途 171
6.3.2 各種描述符實(shí)現(xiàn)方式 175
6.3.3 使用描述符時(shí)需要考慮的其他方面 178
6.4 分析描述符 182
6.4.1 Python如何在內(nèi)部使用描述符 182
6.4.2 在裝飾器中實(shí)現(xiàn)描述符 187
6.5 描述符結(jié)語 188
6.5.1 描述符的接口 188
6.5.2 描述符的面向?qū)ο笤O(shè)計(jì) 188
6.5.3 描述符中的類型注解 188
6.6 小結(jié) 189
6.7 參考資料 189
第7章 生成器、迭代器和異步編程 190
7.1 技術(shù)要求 190
7.2 創(chuàng)建生成器 190
7.2.1 初識生成器 191
7.2.2 生成器表達(dá)式 193
7.3 以慣用法迭代 195
7.4 協(xié)程 205
7.4.1 生成器接口中的方法 205
7.4.2 高級協(xié)程 210
7.5 異步編程 216
7.5.1 異步魔法方法 217
7.5.2 異步迭代 219
7.5.3 異步生成器 221
7.6 小結(jié) 222
7.7 參考資料 223
第8章 單元測試和重構(gòu) 224
8.1 設(shè)計(jì)原則與單元測試 224
8.1.1 其他形式的自動測試 225
8.1.2 單元測試與敏捷軟件開發(fā) 226
8.1.3 單元測試與軟件設(shè)計(jì) 227
8.1.4 確定測試范圍 230
8.2 測試工具 230
8.3 重構(gòu) 248
8.3.1 代碼演進(jìn) 249
8.3.2 需要演進(jìn)的并非只有生產(chǎn)代碼 251
8.4 再談測試 252
8.4.1 基于屬性的測試 252
8.4.2 變異測試 253
8.4.3 常見的測試概念 255
8.4.4 測試驅(qū)動開發(fā)簡介 256
8.5 小結(jié) 257
8.6 參考資料 257
第9章 常見設(shè)計(jì)模式 259
9.1 在Python中使用設(shè)計(jì)模式時(shí)需要注意的事項(xiàng) 260
9.2 設(shè)計(jì)模式實(shí)戰(zhàn) 261
9.2.1 創(chuàng)建型模式 261
9.2.2 結(jié)構(gòu)型模式 267
9.2.3 行為型模式 273
9.3 空對象模式 283
9.4 設(shè)計(jì)模式結(jié)語 284
9.4.1 模式對設(shè)計(jì)的影響 285
9.4.2 作為理論的設(shè)計(jì)模式 286
9.4.3 模型中的名稱 286
9.5 小結(jié) 286
9.6 參考資料 287
第 10章 整潔的架構(gòu) 288
10.1 從整潔代碼到整潔架構(gòu) 288
10.1.1 關(guān)注點(diǎn)分離 289
10.1.2 大一統(tǒng)的應(yīng)用程序和微服務(wù) 290
10.1.3 抽象 291
10.2 軟件組件 292
10.2.1 包 292
10.2.2 Docker容器 298
10.2.3 用例 299
10.2.4 服務(wù) 303
10.3 小結(jié) 308
10.4 參考資料 309
結(jié)語 310