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

2024-05-23 18:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读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?在


Tags: thetonamefrompymodulesinitas
2条回答

假设您有一个项目包含一个名为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/等的目录,那么这样做是有问题的。在

相关问题 更多 >