隐藏真正的模块

时间:2014-09-25 11:34:22

标签: python python-3.x module directory

主题是包导入和__init__文件: 规范中有一句话说

  

这些文件用于防止具有通用名称的目录   无意中隐藏了稍后出现在模块上的真实模块   搜索路径。如果没有这种安全措施,Python可能会选择一个目录   这与您的代码无关,只是因为它看起来是嵌套的   在搜索路径的早期目录中。

你能给我一些实际的例子吗?

2 个答案:

答案 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 - 显式是比隐含更好。