49. 为每个函数、类和模块编写文档字符串

  • 我们要通过docstring, 为每个模块,类和函数编写文档。在修改代码的时候,应该更新这些文档
  • 为模块编写文档时,应该介绍本模块的内容,并且要把用户应该了解的重要类及重要函数列出来
  • 为类撰写文档时,应该在class语句下面的docstring中,介绍本类的行为、重要属性,以及本来的子类应该实现的行为
  • 为函数及方法撰写文档时,应该在def语句下面的docstring中,介绍函数的每个参数,函数的返回值,函数的执行过程中可能抛出的异常,以及其他行为。

50. 用包来安排模块,并提供稳固的API

  • python 包是一种含有其他模块的模块。我们可以用包把代码划分成各自独立且互不冲突的名称空间,使得每块代码都具备独有的绝对模块名称。
  • 主要把 __init__.py 文件放入含有其他源文件的目录里,就可以将该目录定义为包。目录中的文件,都将成为包的子模块。在包的目录下面,也可以含有其他包
  • 把外界可见的名称,列在名为 __all__的特殊属性里,即可为包提供一套明确的API
  • 如果想要隐藏某个包的内部实现,那么我们可以在包的__init__.py 文件中,只把外界可见的那些名称引入进来,或是给仅限内部使用的那些名称添加下划线前缀
  • 如果软件包只在开发团队或代码库内部使用,那可能没有必要通过 __all__来明确地导出API

51. 为自编的模块定义根异常,以便将调用者与API相隔离

  • 为模块定义根异常,可以把API的调用者与模块的API相隔离
  • 调用者在使用API时,可以通过捕获根异常,来发现调用代码中隐藏的bug
  • 调用者可以通过捕获python的Exception 基类,来帮助模块的研发者找寻API实现代码中的bug
  • 可以从模块的根异常里面,继承一些中间异常,并领API的调用者捕获这些中间异常。这样模块开发者将来就能在不破坏原有调用代码的前提下,为这些中间异常分别编写具体的异常子类

52. 用适当的方式打破循环依赖关系

  • 如果两个模块必须相互调用对方,才能完成引入操作,那就会出现循环依赖现象,这坑能导致程序在启动的时候崩溃
  • 打破循环依赖关系的最佳方案,是把导致两个模块互相依赖的那部分代码,重构为单独的模块,并把它放在依赖树的底部
  • 打破循环依赖关系的最简方案,是执行动态模块引入操作,这样既可以缩减重构所花的精力,也可以尽量降低代码的复杂度

53. 用虚拟环境隔离项目,并重建其依赖关系

  • 借助虚拟环境,我们可以在同一台电脑上面同时安装某软件的包的多个版本,而且保证他们不会冲突
  • pyvenv命令可以创建虚拟环境, source bin/activate 命令可以激活虚拟环境,deactivate 命令可以停用虚拟环境
  • pip freeze 命令可以把某套环境所依赖的软件包,汇总到一份文件里面。我们把这个 requirements.txt文件提供给 pip install -r 命令,即可重建一套与原环境相仿的新环境
  • 如果使用python3.4之前的版本做开发,那么必须单独下载并安装类似的pyvenv工具。那个命令行工具不叫 pyvenv,而是叫做 virtualenv

继续阅读关于 的文章



Fork me on GitHub