在阅读python manual的6.4包部分时,我遇到了以下一行:
The
__init__.py
files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path.
我知道需要__init__.py
将目录标记为包含包,但我不明白prevent directories with a common name...from unintentionally hiding valid modules...
是什么意思。在
有人能解释一下为什么需要__init__.py
?在
假设您有一个项目包含一个名为
math
的目录,其中包含一些数字数据。如果不需要__init__.py
,那么当你做import math
时,它会尝试导入该目录,而不是真正的math
模块。但是由于您的目录只包含数据而不是实际的Python代码,因此导入将失败。因此,{{t{1>从你的标准目录导入的^{1>并不包含你的标准cd1}库中的所有代码。在__init__.py
就像一个确认,目录上写着“是的,我真的是一个Python包,而不仅仅是一个充满文件的目录。任何不以这种方式“声明”自己的目录都会被跳过,因为Python知道它们不能被导入。这是很好的,因为Python标准库有很多通用名称(os、math、time、symbol、resource等)的模块。如果没有__init__.py
要求,您将永远无法为Python路径上的任何目录使用这些名称,甚至不能存储与Python无关的数据或文件。在在这种情况下,
string
实际上不是最好的例子。有一个名为string
的模块,但是现在它没有那么有用了,因为它的大多数函数都可以作为str
类型的方法使用。但是,正如我提到的,还有很多其他模块都有通用名称。在在源代码树中可能有一个名为string/的文件夹,其中包含本地化数据,但是当您尝试在代码中使用
import string
,而不使用__init__.py
,Python将尝试导入此目录而不是标准库模块。虽然在某些情况下,您可能希望隐藏标准库模块,但如果您碰巧使用了名为http/、string/、os/等的目录,那么这样做是有问题的。在相关问题 更多 >
编程相关推荐