我对如何导入和组织我的子模块有些迷茫,需要一些文献和一些惯例。
问题
我们想编写一个用Python编写的新软件包,它由几个组件组成:
- 对最终用户有用的类和函数
- 很少使用的类和函数
- 仅被软件包本身需要的实用程序类和函数
- 外部模块
我们考虑这种架构:
pizzafactory
├── __init__.py
├── salt.py
├── water.py
├── vegetables
│ ├── __init__.py
│ └── tomatoes.py
└── dough
├── __init__.py
└── flour.py
一些考虑因素
- 最终用户不需要使用原材料,如面团或水
- 客户只需要在
pizzafactory/__init__.py
中描述的披萨 - 面团工厂需要盐和水
- 客户可能想在他的披萨上添加一些番茄。
文件pizzafactory/__init__.py
几乎需要所有模块,但因为我们不想用无用的东西污染最终用户的命名空间。我建议安静地导入原材料,除了那些可能被客户使用的原材料:
# pizzafactory/__init__.py
import salt as _salt
import dough as _dough
import vegetables.tomatoes
import oven as _oven # External package
制作面团的工厂需要一些水,但需要使用该子模块(制作面包)的用户可能不想看到 water
。
# pizzafactory/dough/__init__.py
import pizzafactory.water as _water
讨论
首先,我认为直接导入全部内容是更容易的选择,可以使用完整的包:
import pizzafactory
def grab_tomato():
return pizzafactory.vegetables.tomatoes.BeefsteakTomato()
或者只选择所需元素:
from pizzafactory.vegetables.tomatoes import BeefsteakTomato
def grab_tomato():
return BeefsteakTomato()
这两种方法都很常见,但它们可能会污染 pizzafactory
命名空间,因此最好使用导入名称混淆。我意识到没有人这样做,但我不知道为什么。
问题
在这个通用示例中,我想知道如何正确地导入模块、子模块和外部包,以便:
- 最小化命名空间占用
- 帮助最终用户清楚地看到他只需要使用的内容