你的Python项目是否正在变得越来越庞大?随着代码的扩展,调试和维护工作变得更加艰难,你是否感到痛苦?Python是一种容易学习和使用的语言,但这也意味着系统可以迅速发展到无法理解的程度。值得庆幸的是,Python具有帮助开发者克服可维护性困境的功能。
在这本实用的书中,作者Patrick Viafore将告诉你如何大限度地使用 Python的类型系统。你将看到用户定义的类型(如类和枚举),以及Python的类型提示系统。你还将学习如何使Python代码具有可扩展性,以及如何基于一个全面的测试策略构建安全网。利用这些知识和技术,你将编写更清晰、更易于维护的代码。
通过学习本书,你将:
*了解为什么类型在现代开发生态系统中是必不可少的。
*了解类、字典和枚举等类型选择是如何反映特定意图的。
*在不加剧臃肿的情况下使Python代码在未来可扩展。
*使用流行的Python工具来提高代码库的安全性和健壮性。
*评估当前的代码以检测常见的可维护性问题。
*通过linter和测试构建代码库的安全网。
......(更多)
Patrick Viafore在关键任务软件领域有超过14年的工作经验,专业方向涉及雷电检测、电信和操作系统。他通过开发管道和工具,将Ubuntu镜像部署到公有云供应商,并通过Kudzera有限责任公司进行软件咨询和项目承包(他是这家公司的负责人)。他的目标是使计算机科学以及软件工程主题对开发者社区来说更加容易理解。
......(更多)
第1章 健壮的Python简介9
1.1 健壮性9
1.2 你的意图是什么12
1.3 Python中的意图示例18
1.3.1 集合18
1.3.2 迭代21
1.3.3 最小惊讶原则22
1.4 小结24
第一部分 为代码添加类型注解
第2章 Python类型简介27
2.1 类型中有什么27
2.1.1 机器表达27
2.1.2 语义表达29
2.2 类型系统32
2.2.1 强类型与弱类型32
2.2.2 动态类型与静态类型33
2.2.3 鸭子类型34
2.3 小结36
第3章 类型注解37
3.1 什么是类型注解37
3.2 类型注解的好处41
3.2.1 自动补全41
3.2.2 类型检查器42
3.2.3 练习:找出bug43
3.3 什么时候使用类型注解45
3.4 小结46
第4章 约束类型47
4.1 Optional类型48
4.2 Union类型53
4.3 Literal类型57
4.4 Annotated类型58
4.5 NewType58
4.6 Final类型60
4.7 小结61
第5章 集合类型62
5.1 向集合添加类型注解62
5.2 同构集合与异构集合63
5.3 向字典添加类型67
5.4 创建新的集合类型69
5.4.1 泛型69
5.4.2 修改现有的类型71
5.4.3 像ABC一样简单74
5.5 小结76
第6章 自定义你的类型检查器77
6.1 配置类型检查器77
6.1.1 配置mypy78
6.1.2 mypy报告81
6.1.3 加速mypy82
6.2 其他类型检查器83
6.2.1 Pyre83
6.2.2 Pyright88
6.3 小结90
第7章 采用类型检查的实践91
7.1 权衡利弊92
7.2 早日实现投入产出平衡93
7.2.1 找到你的痛点93
7.2.2 从战略上选择目标代码94
7.2.3 依靠工具95
7.3 小结101
第二部分 定义你自己的类型
第8章 用户自定义类型:枚举105
8.1 用户自定义类型105
8.2 枚举106
8.2.1 Enum108
8.2.2 何时不使用109
8.3 高级用法109
8.3.1 自动分配值109
8.3.2 Flag111
8.3.3 整数转换112
8.3.4 唯一性114
8.4 小结115
第9章 用户自定义类型:数据类116
9.1 数据类实战116
9.2 用法120
9.2.1 字符串转换120
9.2.2 相等性121
9.2.3 关联性比较121
9.2.4 不变性123
9.3 与其他类型的比较124
9.3.1 数据类与字典124
9.3.2 数据类与TypedDict125
9.3.3 数据类与命名元组125
9.4 小结126
第10章 用户自定义类型:类127
10.1 类的剖析127
10.2 不变量129
10.2.1 避免损坏的不变量131
10.2.2 为什么不变量是有益的132
10.2.3 沟通不变量134
10.2.4 消费你的类134
10.2.5 维护者怎么办136
10.3 封装和维护不变量137
10.3.1 封装137
10.3.2 保护数据访问138
10.3.3 操作140
10.4 小结142
第11章 定义你的接口144
11.1 自然接口设计145
11.2 自然的交互148
11.2.1 自然接口实践149
11.2.2 魔法方法153
11.2.3 上下文管理器155
11.3 小结158
第12章 子类型159
12.1 继承159
12.2 可替代性163
12.3 设计方面的考虑168
12.4 小结171
第13章 协议172
13.1 类型系统之间的张力172
13.1.1 留空类型或使用Any类型174
13.1.2 使用Union174
13.1.3 使用继承174
13.1.4 使用mixin176
13.2 协议177
13.3 高级用法179
13.3.1 复合协议179
13.3.2 运行时可检查协议180
13.3.3 满足协议的模块180
13.4 小结181
第14章 使用pydantic进行运行时检查183
14.1 动态配置183
14.2 pydantic189
14.2.1 验证器190
14.2.2 验证与解析193
14.3 小结194
第三部分 可扩展的Python
第15章 可扩展性197
15.1 可扩展性是什么197
15.2 开闭原则203
15.2.1 检测OCP侵犯203
15.2.2 缺点204
15.3 小结205
第16章 依赖关系206
16.1 关系207
16.2 依赖关系的类型209
16.2.1 物理依赖关系209
16.2.2 逻辑依赖关系212
16.2.3 时间依赖关系213
16.3 可视化你的依赖关系215
16.3.1 可视化包215
16.3.2 可视化导入216
16.3.3 可视化函数调用217
16.3.4 解释依赖关系图219
16.4 小结220
第17章 可组合性221
17.1 可组合性介绍221
17.2 策略与机制225
17.3 较小规模的组合228
17.3.1 组合函数228
17.3.2 组合算法231
17.4 小结234
第18章 事件驱动的架构235
18.1 工作原理235
18.2 简单的事件237
18.2.1 使用消息代理237
18.2.2 观察者模式239
18.3 事件流241
18.4 小结243
第19章 可插入的Python245
19.1 模板方法模式246
19.2 策略模式248
19.3 插件式架构250
19.4 小结253
第四部分 构建安全网
第20章 静态分析257
20.1 lint检测257
20.1.1 编写自己的Pylint插件259
20.1.2 分解插件261
20.2 其他静态分析器263
20.2.1 复杂度检查器264
20.2.2 安全分析266
20.3 小结267
第21章 测试策略268
21.1 定义测试策略268
21.2 降低测试成本273
21.3 小结282
第22章 验收测试283
22.1 行为驱动开发284
22.1.1 Gherkin语言284
22.1.2 可执行规范286
22.2 额外的behave特性288
22.2.1 参数化步骤288
22.2.2 表格驱动的需求288
22.2.3 步骤匹配289
22.2.4 定制测试生命周期289
22.2.5 使用标记选择性地运行测试290
22.2.6 报告生成290
22.3 小结292
第23章 基于属性的测试293
23.1 用Hypothesis开展基于属性的测试293
23.1.1 Hypothesis的魔力297
23.1.2 与传统测试的对比298
23.2 充分利用Hypothesis299
23.2.1 Hypothesis策略299
23.2.2 生成算法300
23.3 小结303
第24章 突变测试305
24.1 什么是突变测试305
24.2 用mutmut进行突变测试307
24.2.1 修复突变体309
24.2.2 突变测试报告310
24.3 采用突变测试311
24.4 小结314
......(更多)
......(更多)