17.1. 开发者工具

经过这么长时间的发展, Python 进化出一套庞大的模块生态系统来让 Python 的开发者无需从头开始编写所有东西。工具的开发者们也在他们的工作中践行着这个哲学,即使在最终版本可能并没有如此。本节所涵盖的 Python 模块是对常规开发任务如测试,调试和分析所提供的装备。

帮助开发者的最基本的形式是他们所用代码的文档。 pydoc 模块会生成由源代码中的文档字符串格式化后的参考文档。

Python 默认有两个测试框架来进行自动锤炼代码和检测是否能正确运行。doctest 会提取包含在文档中的测试用例进行测试,不管是内嵌代码还是单个文件都是可以的。unittest  则是一个全功能自动测试框架,支持 fixture,预定义的测试套件和测试发掘。

trace 模块监控 Python 执行时的过程,之后生成一份每行代码的运行报告。它所提供的信息可以用来发现那些没有被测试套件测试到的代码路径,也可以供我们研究模块间函数的调用依赖。
写测试可以让我们发现程序中的问题。在 Python 中调试也更简单些,因为在大多数情况下,未处理的错误都会反馈到控制台上。如果程序并未运行在文本控制台环境中,traceback 也可以输出到日志文件或信息对话框中。对于某些情况,只有标准的追溯(traceback)信息并不够,可以用 cgitb 来查看更详细的信息,如栈中每一层级的变量和资源上下文。 cgitb 也可以将追溯(traceback)信息格式化为 HTML,以 web 应用的方式报告错误。

一旦确定了错误,使用交互式调试器 pdb 可以通过复现代码在那种情况下发生错误的步骤来进行准确修复,在其中也可以使用即时对象和代码进行实验。

在测试和调试的帮助下程序正常运行之后,下一步关注的点就是性能了。profile 和 timeit 模块可以让开发者测量程序运行的速度,以便发现其中拖慢速度的部分,然后将它们分离改进。

像 Python 这样空格有非常大作用的语言,缩进代码尤其重要。 tabnanny 模块提供一个检测器来报告含糊不清的缩进使用,也可以用于测试代码是否符合最低的标准。

要运行 Python 程序需要将字节编译的代码给解释器运行。字节编译的代码可以即时创建,或者打包时一次性创建。 compileall 模块暴露的接口用在安装程序或打包工具中来创建包含该模块字节码的文件。也可以用在开发环境中来确保某文件没有语法错误以及在发布时创建一份字节编译的版本。

在源代码层, pyclbr  模块有一个可以让文本编辑器使用的类浏览器,同时也可以让其他程序扫描 Python 源码找到感兴趣的部分比如函数,类啊而无需导入代码和一些可能的副作用。

Python 的虚拟环境,.可以用 venv 来管理,定义一个隔离的环境来安装包和运行程序。用此方法可以很容易得测试同一个程序的不同版本依赖,也可以在同一台电脑中安装本来互相冲突的不同程序。

要利用庞大的扩展模块,框架和工具的生态系统,我们需要包安装器。pip 是 Python 的一个包安装器,不过它并不随着 Python 的解释器一起发布,因为解释器有较长的发布周期。不过我们可以使用 ensurepip 来安装最新版本的 pip。