最近,我在学习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
是否在此系统上安装的较小优势,而不会对已安装哪些可交付项做出任何假设。