【发布时间】:2017-02-23 02:25:04
【问题描述】:
我对如何导入和组织我的子模块有点迷茫,我需要一些文献和一些约定。
问题
我们想编写一个用 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 命名空间,因此最好修改导入名称。我意识到没有人这样做,我不知道为什么。
问题
在这个通用示例中,我想知道如何正确导入模块、子模块和外部包,以便:
- 最小化命名空间占用空间
- 帮助最终用户清楚地看到他打算使用什么
【问题讨论】:
标签: python module package packages python-import