• 10.1 构建一个模块的层级包
    • 问题
    • 解决方案
    • 讨论

    10.1 构建一个模块的层级包

    问题

    你想将你的代码组织成由很多分层模块构成的包。

    解决方案

    封装成包是很简单的。在文件系统上组织你的代码,并确保每个目录都定义了一个init.py文件。例如:

    1. graphics/
    2. __init__.py
    3. primitive/
    4. __init__.py
    5. line.py
    6. fill.py
    7. text.py
    8. formats/
    9. __init__.py
    10. png.py
    11. jpg.py

    一旦你做到了这一点,你应该能够执行各种import语句,如下:

    1. import graphics.primitive.line
    2. from graphics.primitive import line
    3. import graphics.formats.jpg as jpg

    讨论

    定义模块的层次结构就像在文件系统上建立目录结构一样容易。文件init.py的目的是要包含不同运行级别的包的可选的初始化代码。举个例子,如果你执行了语句import graphics, 文件graphics/init.py将被导入,建立graphics命名空间的内容。像import graphics.format.jpg这样导入,文件graphics/init.py和文件graphics/formats/init.py将在文件graphics/formats/jpg.py导入之前导入。

    绝大部分时候让init.py空着就好。但是有些情况下可能包含代码。举个例子,init.py能够用来自动加载子模块:

    1. # graphics/formats/__init__.py
    2. from . import jpg
    3. from . import png

    像这样一个文件,用户可以仅仅通过import grahpics.formats来代替import graphics.formats.jpg以及import graphics.formats.png。

    init.py的其他常用用法包括将多个文件合并到一个逻辑命名空间,这将在10.4小节讨论。

    敏锐的程序员会发现,即使没有init.py文件存在,python仍然会导入包。如果你没有定义init.py时,实际上创建了一个所谓的“命名空间包”,这将在10.5小节讨论。万物平等,如果你着手创建一个新的包的话,包含一个init.py文件吧。

    原文:

    http://python3-cookbook.readthedocs.io/zh_CN/latest/c10/p01_make_hierarchical_package_of_modules.html