1.2 项目结构

项目结构应该保持简单,审慎地使用包和层次结构,过深的层次结构在目录导航时将如同梦魇,但过平的层次结构则会让项目变得臃肿。

一个常犯的错误是将单元测试放在包目录的外面。这些测试实际上应该被包含在软件的子一级包中,以便:

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

 
  • 避免被setuptools(或者其他打包的库)作为tests顶层模块自动安装;
  • 能够被安装,且其他包能够利用它们构建自己的单元测试。

图1-1展示了一个项目的标准的文件层次结构。

阅读 ‧ 电子书库

图1-1 标准的包目录结构

setup.py是Python安装脚本的标准名称。在安装时,它会通过Python分发工具(distuils)进行包的安装。也可以通过README.rst(或者README.txt,或者其他合适的名字)为用户提供重要信息。requirements.txt应该包含Python包所需要的依赖包,也就是说,所有这些包都会预先通过pip这样的工具进行安装以保证你的包能正常工作。还可以包含test-requirements.txt,它应该列出运行测试集所需要的依赖包。最后,docs文件夹应该包括reStructuredText格式的文档,以便能够被Sphinx处理(参见3.1节)。

包中还经常需要包含一些额外的数据,如图片、shell脚本等。不过,关于这类文件如何存放并没有一个统一的标准。因此放到任何觉得合适的地方都可以。

下面这些顶层目录也比较常见。

 
  • etc用来存放配置文件的样例。
  • tools用来存放与工具有关的shell脚本。
  • bin用来存放将被setup.py安装的二进制脚本。
  • data用来存放其他类型的文件,如媒体文件。

一个常见的设计问题是根据将要存储的代码的类型来创建文件或模块。使用functions.py或者exceptions.py这样的文件是很糟糕的方式。这种方式对代码的组织毫无帮助,只能让读代码的人在多个文件之间毫无理由地来回切换。

此外,应该避免创建那种只有一个__init__.py文件的目录,例如,如果hooks.py够用的话就不要创建hooks/__init__.py。如果创建目录,那么其中就应该包含属于这一分类/模块的多个Python文件。