2014-09-25 54 views
0

主题是包装的产品进口和__init__文件: 存在这样说隐藏真正的模块

这些文件有助于防止与通用名目录从 规范一个报价无意中在以后出现真正的模块在模块 搜索路径。没有这种保护措施,Python可能会选择一个与您的代码无关的目录 ,仅仅因为它在搜索路径的早期目录中出现嵌套 。

你能举这个例子吗?

回答

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。因此,可以接受这个概念,因为与命名空间包的好处相比,由于偶然的成功而可能造成混淆的风险被认为太小。

除非你打算提供一个名称空间包,例如,为了让插件模块能够将它们放入不同的目录(可以作为不同的OS包安装),那么你应该总是为你的Python包提供__init__.py - 显式比隐式。

+0

我尝试@Martijn的例子,事实上,即使没有任何__init__.py文件,导致“images”目录被导入,只是因为它在搜索路径的前面找到。我认为只有包含__init__的目录.py文件被导入。 – tt0686 2014-09-25 13:46:47

+1

@ tt0686:是的,如果'sys.path'中没有'images/__ init __。py'或'images。{py,pyc,...}',那么'images'目录会导致'import images'成功:*“如果''在'sys.path'中,那么'import foo'可能对应于'/foo',即使没有' /foo/__init__.py'"* – jfs 2014-09-25 13:49:26

+0

但是,导入没有任何陈述或方法的东西?只是一个目录? – tt0686 2014-09-25 13:51:43

1

如果允许任何目录被视为一个包,然后尝试导入的存在既作为目录作为搜索路径上的模块可以挑选的目录在模块的模块。

假设您有images目录images.py模块。如果在搜索路径中较早找到它,import images将找到images目录。

通过要求__init__.py来标记包,可以将这些数据目录包含在Python代码旁边,而不必担心会掩盖具有相同名称的真正模块。