首页>参考读物>计算机科学与技术>软件与程序设计

Python进阶:实际应用开发实战
作者 : [英]马修·威尔克斯(Matthew Wilkes) 著
译者 : 赵利通 译
丛书名 : 华章程序员书库
出版日期 : 2022-01-18
ISBN : 978-7-111-70104-0
定价 : 129.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 456
开本 : 16
原书名 : Advanced Python Development: Using Powerful Language Features in Real-World Applications
原出版社: Apress
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书的目标是介绍Python语言及其工具中并不是每个人都知道的部分。如果你是一名经验丰富的开发人员,则很可能已经知道本书要介绍的许多工具,但可能也有很多是你想要使用、但还没有时间了解的工具。如果你负责一个已建成的稳定系统,就更可能遇到这种情况,因为对于这样的系统,并不能够频繁地重构组件来利用新的语言特性。

图书特色

资深开发人员介绍从设计原型到实际产品的Python开发全流程
涵盖Python 3.8和Python 3.9的内容,并提供示例代码下载

图书前言

Python是一门非常成功的编程语言,自问世以来的30多年间,得到了非常广泛的应用。主流操作系统默认提供Python,世界上的一些大型网站使用Python开发后台,科学家常使用Python来拓展新知识。因为这么多人每天都在使用Python,所以Python的改进会快速、大量地出现。并不是每个Python开发人员都有机会参加会议,或者有时间关注社区不同部分所做的工作,所以Python语言及其生态系统的一些功能难免没有得到它们应得的关注。
本书的目标是介绍Python语言及其工具中并不是每个人都知道的部分。如果你是一名经验丰富的开发人员,则很可能已经知道了本书要介绍的许多工具,但可能也有很多是你想要使用却没有时间了解的工具。如果你负责维护一个已建成的稳定系统,就更可能遇到这种情况,因为对于这样的系统,无法频繁地通过重构组件来利用新的语言特性。
如果你使用Python的时间较短,则可能更加熟悉该语言近期新增的特性,但不会很熟悉广阔生态系统中的一些可用的库。参加一些活动(如Python会议)的一大好处是有机会注意到其他程序员带来的质量改进,并把它们集成到自己的工作流中。
本书并不是一本用独立小节介绍Python不同特性的参考书。相反,本书是按照构建一个真实软件的方式来组织各个章节的。
许多技术文档倾向于提供简单的示例。简单的示例很适合解释某个特性的工作方式,但是对于理解什么时候使用这种特性没有太大帮助。而且,也很难把简单的示例作为基础来构建软件,因为复杂代码的架构方式与简单代码有很大的区别。
通过使用这个示例,我们能够在具体的上下文中思考技术选择。你将了解在判断某个方法是否合适时,需要记住哪些考虑因素。使用方式彼此相关的主题将被放到一起进行介绍,而不是把工作方式相关的主题放到一起进行介绍。
关于本书
我撰写本书的目的,是分享我从社区不同地方学到的知识,以及我在超过15年的时间中编写Python代码所积累的经验。本书可以帮助你利用核心语言和增件库来提高生产效率。你将学习如何使用异步编程、打包和测试等语言特性来成为一名高效的程序员,尽管严格来说,作为一名程序员,并非必须使用它们。
但是,本书的目标读者是那些想要编写代码的人,而不是想要理解深层原理的人。我不会深入介绍涉及Python实现细节的主题。你不需要“grok”Python C扩展、元类或算法,就可以通过阅读本书获益。
重要的代码示例用编号的代码清单展示,本书配套代码包含这些代码清单的电子版。其中一些代码清单下面还直接显示了输出,而不是用编号图的方式单独显示输出。
在本书的配套代码中,还可以找到示例项目的代码库的完整版本,以及帮助完成练习的代码。总的来说,我建议你从https://github.com/Apress/advanced-python-development签出Git存储库,然后切换到你正在阅读的章节的相关分支,一步步学习代码。
除了代码清单,本书还展示了一些控制台会话。当格式上类似于代码的行以>开头时,说明显示的是一个shell会话。这些部分包括需要从操作系统的终端运行的命令。包含>>>的行演示的是Python控制台会话,应该从Python解释器运行。
示例
本书的示例是一个通用的数据聚合器。如果你从事DevOps领域的工作,则很可能会使用这种类型的程序来跟踪服务器上的资源使用情况。此外,作为一名Web开发人员,你可能会使用类似的程序,把同一系统的不同部署的统计数据聚合起来。例如,一些科学家使用类似的方法来聚合分布在城市中的空气质量传感器的读数。并不是每个开发人员都需要构建这种应用程序,但许多开发人员都熟悉这个问题领域。
选择构建这个应用程序,并不只是因为这是一个常见的任务,也因为它允许我们以一种自然的、统一的方式,探讨我们想要介绍的许多主题。使用运行任何现代操作系统的现代计算机,都可以很好地学习本书的完整示例,并且不需要购买任何额外的硬件。如果你有其他计算机可以作为远程数据源,则可能会从一些示例中收获更多。
在本书的示例中,我将使用安装了售后传感器的树莓派Zero。这个平台很容易买到,其售价大约为5美元,它能够提供许多有趣的数据。许多树莓派专营店还提供商用的传感器增件。
虽然我会推荐一些特别适用于树莓派的方法,让学习本书示例变得更加简单,但是本书并不是在介绍物联网或者树莓派。它只是一种手段,如果愿意,你可以自由调整示例,使其适用于你感兴趣的任务。前面提到的类似问题将遵循相同的设计过程。
本书内容
本书精心挑选了主题,旨在介绍Python编程的各个不同方面。Python社区作为一个整体没有充分理解或者利用这些方面,而且在指导新人时,不会把它们理所当然地教给新人。这并不是说这些特性一定很复杂,或者很难理解(当然有些特性确实如此),我相信,所有程序员都应该熟悉这些特性,即使他们并不会用到这些特性。
第1章将介绍使用Python编写简单程序的不同方式,还会介绍Jupyter记事本以及Python调试器的用法。虽然这两者都是相对来说为人熟知的工具,但很多人只熟悉其中的一个工具,而不是两者都能够熟练使用。本章还会介绍编写命令行接口的不同方式,以及一些有用的第三方库,它们支持简洁的命令行工具开发。
第2章将介绍帮助识别代码中的错误的工具,例如自动测试和linting工具。无论是编写大型代码库、很少需要编辑的代码库,还是要吸收第三方贡献的代码库,这些工具都能够让你更容易地写出让自己有信心的代码。这里介绍的工具都是我推荐的工具,但是,本章的关注点是理解它们的优缺点。你可能已经使用过其中的一个或多个工具,并且对于是否适合使用它们有自己的观点。本章将帮助你理解权衡点,从而做出明智的决定。
第3章将介绍Python中的代码打包和依赖项分发。对于编写可分发给其他人的应用程序,以及设计能够可靠工作的部署系统来说,这些都是重要的功能。我们将使用这些功能,把独立的脚本转换为可安装的应用程序。
第4章将介绍插件架构。这是一种强大的功能。经常可以看到学习插件架构的人使用它,这导致讲解Python的人们对于是否讲解插件架构持谨慎态度。对于我们的示例,插件架构十分适用。本章还将介绍一些用于命令行工具的高级技术,它们能够让调试基于插件的系统变得更加容易。
第5章将介绍Web接口和编写复杂函数的技术,如装饰器和闭包。这些技术在Python中已经是习语,但在其他许多编程语言中很难表达。本章还将介绍如何恰当地使用抽象基类。人们常常不建议使用抽象基类,因为学习抽象基类的人倾向于到处使用它们。在特定场景中,有节制地使用抽象基类是有优势的,当把抽象基类与第2章介绍的一些工具结合使用时更是如此。
第6章将用另一个重要组件扩展我们的示例,这个组件就是收集数据的聚合服务器。本章还将演示Python程序员会用到的一些最重要的第三方库,例如requests库。
第7章将介绍Python中的线程和异步编程。线程常常会导致难以探查的bug。异步代码能够用于类似的任务,但许多Python程序员还没有使用过这种习语,因为使用异步编程时,程序的行为与同步编程有很大区别。本章重点讨论在真实场景中如何使用并发来实现某个结果,而不只是演示一个简单的示例,或者演示异步编程的局限性。本章旨在得到能够在真实场景中使用的代码,并让你彻底理解权衡点,而不是进行独立的技术演示。
第8章将更加深入地介绍异步编程,讲解异步代码的测试以及一些第三方库。使用这些库能够编写在异步上下文中处理外部工具(如数据库)的代码。本章还将简要地介绍一些可以用来编写出色API的高级技术,例如上下文管理器和上下文变量,它们对于异步编程很有帮助。
第9章返回Jupyter,使用它的一些功能来实现数据可视化和方便的用户交互。我们将介绍如何在Jupyter记事本中把异步代码用于小部件,还将介绍迭代器的高级用法和实现复杂数据类型的多种方式。
第10章将详细介绍如何让Python代码运行得更快,如何使用不同类型的缓存,以及这些缓存适用的场景。本章还将介绍如何对应用程序中的各个Python函数进行基准测试,以及如何解读结果以找出速度缓慢的原因。
第11章将扩展本书前面介绍过的一些概念,以更加优雅地处理错误。我们将介绍如何修改插件架构,以便无缝地处理错误,同时保留完整的向后兼容性,还将深入介绍如何设计在遇到错误时就处理错误的过程。
第12章将使用Python的迭代器和协程来增强我们开发的仪表板,为它们添加一些功能,这些功能不是实现被动的数据收集,而是主动检查收集到的数据,从而允许我们构建包含多个步骤的分析流。
Python版本说明
在撰写本书时,Python的最新版本是Python 3.8,所以本书中的示例是用Python 3.8和Python 3.9的首批开发版本测试的。不建议使用更老的版本。本书中有极少数代码示例不能在Python 3.7或Python 3.6中正常运行。
要学习本书内容,你需要安装Python pip。在安装了Python后,系统中就应该已经安装了pip。有些操作系统故意在Python的默认安装中去掉了pip,此时,你需要使用操作系统的包管理器自己安装。这在基于Debian的系统中很常见,此时使用sudo apt install python3-pip就可以安装pip。在其他操作系统中,可以使用python -m ensurepip --upgrade来让Python找到pip的最新版本,或找到特定于你的操作系统的指令。
本书网站(https://github.com/MatthewWilkes/advanced-python-development)提供了代码示例(也可访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载)和勘误表的电子版。如果在学习本书的过程中遇到任何问题,应该首先访问这些代码示例和勘误表。

上架指导

计算机\程序设计

封底文字

在介绍Python的一些强大特性时,人们常常编造一些示例,以孤立的示例解释各种特性。通过设计并构建真实的应用程序,从设计原型一直演示到开发出符合生产质量要求的应用程序,整个过程不只让你了解各种特性如何工作,还会让你看到它们如何作为更大的系统设计过程的组成部分集成起来。另外,本书还会提供一些有用的注意项,并推荐一些库,这些内容是Python大会问答环节的主要关注点。本书还会讨论现代Python开发的最佳实践和技术,帮助你编写清晰的、易于维护的代码。
本书针对的是已经能够使用Python编写简单程序但想要理解什么时候适合使用高级特性的开发人员,让他们能够自如地使用这些高级特性。想要提升自身Python编程水平以及已经具有丰富的经验但希望了解新版本Python特性的开发人员,都特别适合阅读本书。
通过阅读本书,你将了解以下内容:
? Python异步编程。
? 插件架构。
? 如何使用类型注解。
? Python相关测试技术。
? 打包和依赖项管理。

译者简介

赵利通 译:暂无简介

图书目录

前言
致谢
审校者简介
第1章 原型设计和环境1
1.1 Python中的原型设计1
1.1.1 使用REPL设计原型2
1.1.2 使用Python脚本设计原型5
1.1.3 使用脚本和pdb设计原型6
1.1.4 使用Jupyter设计原型9
1.1.5 本章的原型设计11
1.2 环境设置13
1.3 创建新项目14
1.3.1 设计脚本原型15
1.3.2 安装依赖项18
1.4 导出到.py文件20
1.5 构建命令行接口22
1.5.1 sys模块和argv23
1.5.2 argparse24
1.5.3 click26
1.6 打破界限28
1.6.1 远程内核28
1.6.2 开发不能在本地运行的代码32
1.7 完成后的脚本34
1.8 小结36
更多资源36
第2章 测试、检查和linting37
2.1 测试40
2.1.1 何时编写测试42
2.1.2 创建格式化函数来提高可测试性43
2.1.3 pytest46
2.2 类型检查56
2.2.1 安装mypy57
2.2.2 添加类型提示58
2.2.3 子类和继承60
2.2.4 泛型类型62
2.2.5 调试以及过度使用类型64
2.2.6 何时使用类型,何时避免使用类型66
2.2.7 将类型提示与代码分离67
2.3 linting68
2.3.1 安装flake8和black69
2.3.2 修复现有代码70
2.3.3 自动运行71
2.3.4 拉取时运行73
2.4 小结74
更多资源75
第3章 打包脚本76
3.1 术语77
3.2 目录结构77
3.3 安装脚本和元数据80
3.4 依赖项80
3.5 声明式配置82
3.5.1 在setup.py中需要避免的事项82
3.5.2 使用setup.cfg86
3.6 自定义索引服务器88
3.6.1 创建pypiserver90
3.6.2 持久性91
3.6.3 保密性92
3.6.4 完整性92
3.6.5 wheel格式和在安装时执行代码93
3.7 使用入口点安装控制台脚本95
3.8 README、DEVELOP和CHANGES97
3.8.1 Markdown格式97
3.8.2 reStructuredText格式99
3.8.3 README101
3.8.4 CHANGES.md和版本化101
3.9 上游依赖项版本锁定103
3.9.1 宽松锁定103
3.9.2 严格锁定104
3.9.3 应该使用哪种锁定方案105
3.10 上传版本105
3.11 小结107
更多资源107
第4章 从脚本到框架109
4.1 编写传感器插件110
4.2 添加新的命令行选项113
4.2.1 子命令113
4.2.2 命令选项116
4.2.3 错误处理117
4.2.4 通过实参类型将解析工作
 交给click120
4.2.5 自定义click实参类型121
4.2.6 常用选项123
4.3 允许使用第三方传感器插件124
4.3.1 使用固定名称检测插件126
4.3.2 使用入口点检测插件127
4.3.3 配置文件129
4.3.4 环境变量132
4.3.5 apd.sensors与类似程序的方法对比133
4.4 小结133
更多资源134
第5章 其他接口136
5.1 Web微服务136
5.1.1 WSGI137
5.1.2 API设计142
5.1.3 Flask144
5.1.4 Python装饰器146
5.1.5 测试视图函数157
5.1.6 部署159
5.2 将软件作为第三方软件扩展160
5.2.1 与其他开发人员就签名达成一致165
5.2.2 抽象基类167
5.2.3 后备策略170
5.2.4 综合运用174
5.3 修复代码中的序列化问题176
5.4 版本化API180
5.5 小结183
更多资源183
第6章 聚合过程185
6.1 cookiecutter185
6.2 创建聚合包189
6.2.1 数据库类型190
6.2.2 示例192
6.2.3 对象–关系映射器193
6.2.4 版本化数据库197
6.2.5 加载数据202
6.3 新技术209
6.3.1 数据库210
6.3.2 自定义特性行为210
6.3.3 生成器210
6.4 小结210
更多资源211
第7章 并行和异步212
7.1 非阻塞IO213
7.2 多线程与多进程218
7.2.1 低级线程219
7.2.2 字节码222
7.2.3 锁与死锁225
7.2.4 避免全局状态229
7.2.5 其他同步原语234
7.2.6 ProcessPoolExecutor241
7.2.7 使代码使用多线程241
7.3 asyncio242
7.3.1 async def242
7.3.2 await243
7.3.3 async for245
7.3.4 async with249
7.3.5 异步锁定原语249
7.3.6 使用同步库251
7.3.7 使代码异步化252
7.4 比较255
7.5 做出选择255
7.6 小结257
更多资源258
第8章 高级asyncio259
8.1 测试异步代码259
8.1.1 测试代码260
8.1.2 模拟对象以方便进行单元测试267
8.2 异步数据库276
8.2.1 经典SQLAlchemy风格277
8.2.2 使用run_in_executor280
8.2.3 查询数据282
8.2.4 避免复杂查询284
8.2.5 其他方案293
8.3 异步代码中的全局变量294
8.4 小结296
更多资源297
第9章 查看数据298
9.1 查询函数298
9.1.1 过滤数据303
9.1.2 多层迭代器306
9.1.3 其他过滤器312
9.1.4 测试查询函数313
9.2 显示多个传感器316
9.3 处理数据319
9.4 与Jupyter小部件进行交互323
9.4.1 增加嵌套的同步和异步代码324
9.4.2 进行整理329
9.5 持久端点330
9.6 绘制地图和地理数据330
9.6.1 新的图类型333
9.6.2 在apd.aggregation中支持地图类型的图335
9.6.3 使用新配置绘制自定义地图337
9.7 小结339
更多资源340
第10章 加快速度341
10.1 优化函数341
10.1.1 性能分析和线程343
10.1.2 解读profile报表345
10.1.3 其他性能分析器348
10.2 优化控制流352
10.2.1 可视化性能分析数据356
10.2.2 缓存360
10.3 小结369
更多资源369
第11章 容错371
11.1 错误处理371
11.1.1 从容器获取项372
11.1.2 自定义异常377
11.1.3 涉及多个异常的堆栈跟踪380
11.1.4 测试异常处理383
11.2 警告388
11.3 日志393
11.3.1 嵌套记录器394
11.3.2 自定义动作396
11.3.3 记录配置400
11.3.4 其他处理程序402
11.4 设计时规避问题402
11.5 小结407
更多资源408
第12章 回调与数据分析409
12.1 生成器的数据流409
12.1.1 使用自己的输出的生成器411
12.1.2 增强的生成器414
12.1.3 队列420
12.1.4 选择控制流422
12.2 动作的结构423
12.2.1 分析协程424
12.2.2 摄入数据429
12.2.3 运行分析进程432
12.3 进程状态434
12.4 扩展可用的动作439
12.5 小结441
更多资源442
后记443

教学资源推荐
作者: 郑阿奇 梁敬东
作者: 施霞萍 张欢欢 王瑾德 马可幸 编著
作者: 朱鸣华等
作者: [美]克洛维斯· L.汤多(Clovis L. Tondo) 斯科特· E.吉姆佩尔(Scott E. Gimpel)著
参考读物推荐
作者: Bill Wagner
作者: [美] 大卫·博里基(Dawid Borycki) 著
作者: 李万才 林琪钧 郭琦康 廖洋阳 著