主题是包导入和__init__
文件:
规范中有一句话说
这些文件用于防止具有通用名称的目录 无意中隐藏了稍后出现在模块上的真实模块 搜索路径。如果没有这种安全措施,Python可能会选择一个目录 这与您的代码无关,只是因为它看起来是嵌套的 在搜索路径的早期目录中。
你能给我一些实际的例子吗?
答案 0 :(得分:1)
如果允许任何目录被视为包,那么尝试将作为目录和存在的模块作为搜索路径上的模块导入选择模块上的目录。
假设您有一个images
目录和一个images.py
模块。 import images
如果在搜索路径上找到images
目录,则会找到__init__.py
目录。
通过要求{{1}}标记包,您可以在Python代码旁边包含此类数据目录,而不必担心屏蔽具有相同名称的正版模块。
答案 1 :(得分:1)
目前Python documentation中没有这样的引用。
PEP 420 Implicit Namespace Packages (Python 3.3+) specifies:
<directory>/foo/__init__.py
,则会导入并返回常规包。<directory>/foo.{py,pyc,so,pyd}
,则会导入并返回模块。扩展名的确切列表因平台而异,是否指定了-O
标志。这里的清单具有代表性。<directory>/foo
并且是目录,则会记录该目录,并继续扫描父路径中的下一个目录。即如果<directory>
位于sys.path
,则import foo
可能与<directory>/foo
对应,即使没有<directory>/foo/__init__.py
。 pep被接受因此,与获得命名空间包的好处相比,由于意外import foo
成功而可能造成混淆的风险被认为太小。
除非你打算提供一个命名空间包,例如,为了让插件模块能够将它们放在不同的目录中(可以作为不同的OS包安装),那么你应该总是为你的Python包提供__init__.py
- 显式是比隐含更好。