Python中的包导入:导入命名空间包是否也导入目录中的模块?

最近,我在学习Python中的包导入时遇到了一个问题:导入一个包是否也导入了该目录中的模块?在我的研究中,我发现有一种说法,即在没有__init__.py文件的情况下导入包packB并不会执行任何操作,因为__init__.py告诉了导入过程要导入哪些*.py文件。

但是,我对这种说法的实际用途感到困惑。虽然我是Python新手,但我在线上阅读的所有资料都说,这种"隐式命名空间包"不包含__init__.py文件,因为可能存在多个packB文件夹,它们的内容将合并为一个共同的packB命名空间。

这是否只是上面引用的页面中的错误,还是有一个更清晰的解释我尚未找到?

包可以具有可选的模块,只在需要时才导入。Python自动导入包中的所有内容是不好的做法,因为这可能会导致不必要的开销。

最初,包需要具有一个__init__.py文件,该模块作为包的命名空间导入。这是非常重要的,因为sys.path中的父目录可能还包含非Python子目录,而__init__.py为包的编写者提供了在包导入时导入任何必要模块的位置。

但是,将一个包拆分为多个可交付项使得这一要求更加困难 - 这些可交付项中的哪一个将包含必需的__init__.py?最终,第二种用法胜出。

现在,如果您有一个包含.py文件但没有__init__.py的目录,Python将其导入为空的命名空间。尽管这看似没有用,但它仍然为包中的其他模块提供了一个父命名空间,即使它们需要自己的导入。

例如,如果我有以下目录结构:

cssCopy codefoo/
    time.py

空的"foo"仍然可以区分我可选导入的foo.time模块和标准库中的time模块。import foo可能只具有较小的用处,但import foo.time则不同。import foo具有测试foo是否在此系统上安装的较小优势,而不会对已安装哪些可交付项做出任何假设。