项目结构应该保持简单,审慎地使用包和层次结构:过深的层次结构在目录导航时将如同梦魇,但过平的层次结构则会让项目变得臃肿。
一个常犯的错误是将单元测试放在包目录的外面。这些测试实际上应该被包含在软件的子包中,以便:
- 不会偶尔被**setuptools**(或者其他打包库)作为tests顶层模块自动安装;
- 能够被安装,且被其他包用于构建自己的单元测试。
图1-1展示了一个项目的标准文件层次结构。
`setup.py`是Python安装脚本的标准名称。在安装时,它会通过Python分发工具(distutils)进行包的安装。也可以通过`README.rst`(或者`README.txt`或其他合适的名字)为用户提供重要信息。`requirements.txt`应该包含Python包所需要的依赖包,也就是说,所有这些包都会预先通过`pip`这样的工具进行安装,以保证你的包能正常工作。还可以包含`test-requirements.txt`,它只列出运行测试套件所需要的依赖包。最后,`docs`文件夹应该包括`reStructuredText`格式的文档,以便能够被Sphinx处理(参见5.1节)。
包中还经常需要包含一些额外的数据,如图片、shell脚本等。不过,关于这类文件如何保存并没有一个统一的标准。因此放到任何觉得合适的地方都可以。
![](https://box.kancloud.cn/38f8d21c680d577e5195943f89774a23_2128x1762.png)
图1-1 标准的包目录结构
下面这些顶层目录也经常出现。
- `etc`用来存放配置文件的样例。
- `tools`用来存放与工具有关的shell脚本。
- `bin`用来存放将被`setup.py`安装的二进制脚本。
- `data`用来存放其他类型的文件,如媒体文件。
一个常见的设计问题是根据将要存储的代码的类型来创建文件或模块。使用`functions.py`或者`exceptions.py`这样的文件是很**糟糕的**方式。这种方式对代码的组织毫无帮助,只能让读代码的人在多个文件之间毫无理由地来回切换。
此外,应该避免创建那种只有一个`__init__.py`文件的目录,例如,如果`hooks.py`够用的话就不要创建`hooks/__init__.py`。如果创建目录,那么其中就应该包含属于这一分类/模块的多个Python文件。
- 内容提要
- 中文版序
- 前言
- 第1章 项目开始
- 1.1 Python版本
- 1.2 项目布局
- 1.3 版本编号
- 1.4 编码风格与自动检查
- 1.5 Joshua Harlow访谈
- 第2章 模块和库
- 2.1 导入系统
- 2.2 标准库
- 2.3 外部库
- 2.4 框架
- 2.5 Doug Hellmann访谈
- 第3章 管理API变化
- Christophe de Vienne访谈
- 第4章 时区陷阱
- 第5章 文档
- 5.1 Sphinx和reST入门
- 5.2 Sphinx模块
- 5.3 扩展Sphinx
- 第6章 分发
- 6.1 简史
- 6.2 使用pbr打包
- 6.3 Wheel格式
- 6.4 包的安装
- 6.5 和世界分享你的成果
- 6.6 Nick Coghlan访谈
- 6.7 入口点
- 6.7.1 可视化的入口点
- 6.7.2 使用控制台脚本
- 6.7.3 使用插件和驱动程序
- 第7章 虚拟环境
- 第8章 单元测试
- 8.1 基础知识
- 8.2 fixture
- 8.3 模拟(mocking)
- 8.4 场景测试
- 8.5 测试序列与并行
- 8.6 测试覆盖
- 8.7 使用虚拟环境和tox
- 8.8 测试策略
- 8.9 Robert Collins访谈
- 第9章 方法和装饰器
- 9.1 创建装饰器
- 9.2 Python中方法的运行机制
- 9.3 静态方法
- 9.4 类方法
- 9.5 抽象方法
- 9.6 混合使用静态方法、类方法和抽象方法
- 9.7 关于super的真相
- 第10章 函数式编程
- 10.1 生成器
- 10.2 列表推导
- 10.3 函数式函数的函数化
- 第11章 抽象语法树
- 11.1 用抽象语法树检查来扩展flake8
- 11.2 Hy
- 11.3 Paul Tagliamonte访谈
- 第12章 性能与优化
- 12.1 数据结构
- 12.2 性能分析
- 12.3 有序列表和二分查找
- 12.4 namedtuple和slots
- 12.5 memoization
- 12.6 PyPy
- 12.7 通过缓冲区协议实现零复制
- 12.8 Victor Stinner访谈
- 第13章 扩展与架构
- 13.1 多线程的注意事项
- 13.2 多进程与多线程
- 13.3 异步和事件驱动架构
- 13.4 面向服务架构
- 第14章 RDBMS和ORM
- 14.1 用Flask和PostgreSQL流化数据
- 14.2 Dimitri Fontaine访谈
- 第15章 Python 3支持策略
- 15.1 语言和标准库
- 15.2 外部库
- 15.3 使用six
- 第16章 少即是多
- 16.1 单分发器
- 16.2 上下文管理器
- 第17章 延伸阅读
- 版权信息
- 版权声明
- 欢迎来到异步社区!
- 异步社区的来历
- 社区里都有什么?
- 购买图书
- 下载资源
- 与作译者互动
- 灵活优惠的购书
- 纸电图书组合购买
- 社区里还可以做什么?
- 提交勘误
- 写作
- 会议活动早知道
- 加入异步