python模块
什么是模块
在《失控》中提到一个几千万行的程序(操作系统)要想没有bug是很难,减少bug的解决方案就是不断的拆分功能项,直到不能拆分为止,只要保证拆分的最小功能项通过一定的单元测试,就可能消费bug(当然还有集成性和系统性的bug)。《失控》里说的就是现代软件工程的模块化开发方式,在面向对象开发以及架构设计上都会涉及到。
那什么是模块?从上面可知,模块可以理解为独立的功能拆分,可根据具体业务拆分成大模块和小模块。
举几个例子:
一个入库系统可以拆分成前端的展示模块,后端的业务处理以及中间的交互层;后端业务处理可以拆分成数据处理(如数据库操作等)和具体的不同的业务模块(如计费模块,折扣模块,物料模块等);
一个深度学习的训练可以拆分:
- 数据模块:负责处理和加载数据
- 网络模块:负责构建深度学习网络
- 训练模块:负责调用数据、构建网络以及设计损失和优化器,以及梯度方向传播,还有模型参数的保存和加载等
- 测试推理模块:负责模型测试和推理
- 功能模块:比如常见的utils
以上可能是比较大的模块,还可以细分成更细的小的模块;
- 比如数据模块,可以拆分成小的特定数据的模块,比如不同的数据集的解析不同,可以构建不同的数据集模块和以及可能的数据处理模块(如数据增强);
- 网络模块,可以拆分成不同类型的网络等
可想而知,模块和模块之间是存在引用的关系,设计时要尽可能做到松耦合,能更友好的变更,如果一次变更需要修改大部分的代码,可以考虑下是否做到合理的模块化设计。
总结一下:
- 模块是功能的划分,是软件程序的架构设计
- 模块化是减少bug的有效途径
- 可以适当的模块化,也不要过度模块化,看功能的复杂性,越复杂就有必要拆分的更细
- 千万不要把所有代码都写到一个文件哦!
- 模块不要相互引用
- 如果你听到别人说什么数据层,业务层,xx层,你可以理解为就是模块
python中模块
python中模块可以分为2个:
- 一个python的.py文件,真正的处理功能的模块,可以是公共变量、函数以及类等
- 对模块的逻辑划分即,通过目录层级的方式来管理模块,python是通过package包的方式来实现的;
一个简单的python模块设计:包括主程序main.py,模块model和两个package包(data/utils)
./
├── main.py
├── model.py
├── data
│ ├── dataset.py
│ ├── __init__.py
├── utils
│ ├── utils.py
│ ├── __init__.py
我们先来看下,和主程序平级的模块的调用,model.py 如下包括变量、函数和类等:
- model.py
test = 1
def func