如何构建模块以避免 "import module.module.module" 之类的事情

How to structure modules to avoid things like "import module.module.module"

我有一个结构如下的模块:

/module
    __init__.py
    /submod_1
        __init__.py
        submod_1_class.py
    /submod_2
        __init__.py
        submod_2_class.py

但我发现必须在 submod_1_class.py 中导入 class 非常烦人:

from module.submod_1.submod_1_class import my_class

我希望能够输入的是:

from module import my_class

我浏览了 site-packages 文件夹并浏览了像 numpy 这样的流行模块,但我一直无法弄清楚如何,例如:

import numpy
a = numpy.array([1,2,3,4,5])
numpy 数组对象的定义深埋在 numpy 包的几个子文件夹中时,可以使用

您可以使用 __init__.py 文件来定义可以从给定模块 import 编辑的内容。例如,对结构的一个非常简单的添加将从 submod_1_class 绘制 Class,这样外部用户就可以简单地 from module import Class.

/module
    __init__.py
        from submod_1 import Class
    /submod_1
        __init__.py
            from submod_1_class import Class
        submod_1_class.py
    /submod_2
        submod_2_class.py

例如,在 numpy 中,顶级 __init__.py 包含 a line,内容如下:

from .core import *

这意味着 /core/__init__.py 中定义的所有内容都可以直接在 numpy 命名空间中从外部使用,即使它实际上可能深埋在某些复杂的结构中。