为什么python需要__init__.py来将目录视为包含包?

fo_*_*x86 3 python

在浏览python手册的 6.4 Packages部分时,我遇到了以下行:

__init__.py需要这些文件使Python将目录视为包含包; 这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块.

我知道__init__.py将目录标记为包含包是必需的,但我不明白它的含义prevent directories with a common name...from unintentionally hiding valid modules....

有人可以解释为什么__init__.py需要吗?

Bre*_*arn 10

假设您有一个项目包含一个名为math包含一些数字数据的目录.如果__init__.py不需要,那么当你这样做时import math,它会尝试导入该目录而不是真实math模块.但由于您的目录只包含数据而不是实际的Python代码,导入将失败.因此,即使您的目录根本不包含Python代码,您的math目录也会阻止您从math标准库导入实际模块math.

__init__.py就像一个确认,目录说"是的,我真的是一个Python包,而不仅仅是一个充满文件的目录.导入我是有意义的." 任何不以这种方式"宣布"自己的目录都会被跳过,因为Python知道它们无法导入.这很好,因为Python标准库包含许多通用名称(os,数学,时间,符号,资源等)的模块.如果没有这些__init__.py要求,您将无法在Python路径上的任何目录中使用任何这些名称- 甚至不能存储与Python无关的数据或文件.

string实际上并不是这种情况下最好的例子.有一个被调用的模块,string但它现在不太有用,因为它的大部分功能都可以作为str类型的方法使用.但是,正如我所提到的,还有许多其他模块具有通用名称.