让我们假设我们编写了一些将被分发的组件。让我们称之为“工人”。工作者应该做一些魔术,但API非常简单 - 2或3个类/函数。但是工人的内心很大。我们需要非API函数。
最终用户应该像这样使用它:
from worker import foo
...
foo(x)
或
import worker
...
worker.foo(x)
但是foo使用“login”,它需要大量的位操作,散列,编码等,并且“计算”使用了大量的数学表达式。
所以,现在我们有2个代码组织选项:
只有一个名为“worker”的模块具有API函数(“foo”),内部函数(“login”,“calculate”)和__all__
变量值["foo", ...]
我们创建包“worker”,并将逻辑拆分为子模块:
worker
worker/__init__.py
worker/api.py
worker/login_related.py
worker/calculate_related.py
并在__init__.py
中提出:
from worker.api import *
现在用户不应该知道“worker”是模块还是包。
但他呢?
我知道,worker.__file__
将在最后返回__init__.py
的路径。此外,API函数的限定名称将指向模块,而不是包(除非我在__init__.py
中定义它们)。还有什么其他差异?如何区分“蒙面包”和模块?