Python 隐藏真模
主题是程序包导入和Python 隐藏真模,python,python-3.x,module,directory,Python,Python 3.x,Module,Directory,主题是程序包导入和\uuuuu init\uuu文件: 规范中有一句话说 这些文件用于防止使用公用名称的目录被删除 无意中隐藏稍后出现在模块上的真实模块 搜索路径。如果没有这种保护,Python可能会选择一个目录 这与代码无关,只是因为它看起来是嵌套的 在搜索路径的早期目录中 你能给我一个实际的例子吗?如果你允许任何目录被视为一个包,那么尝试导入一个既作为目录又作为搜索路径上的模块存在的模块可能会选择该模块上的目录 假设您有一个images目录和一个images.py模块导入图像将找到图像目录(
\uuuuu init\uuu
文件:
规范中有一句话说
这些文件用于防止使用公用名称的目录被删除
无意中隐藏稍后出现在模块上的真实模块
搜索路径。如果没有这种保护,Python可能会选择一个目录
这与代码无关,只是因为它看起来是嵌套的
在搜索路径的早期目录中
你能给我一个实际的例子吗?如果你允许任何目录被视为一个包,那么尝试导入一个既作为目录又作为搜索路径上的模块存在的模块可能会选择该模块上的目录
假设您有一个images
目录和一个images.py
模块<代码>导入图像将找到图像
目录(如果在搜索路径的前面找到)
通过要求使用
\uuuuu init\uuuuuuuuuuuupy
标记包,您可以在Python代码旁边包含这样的数据目录,而不必担心屏蔽具有相同名称的真正模块。当前版本中没有这样的引用
:
- 如果找到
,则导入并返回一个常规包/foo/\uuuuu init\uuuuu.py
- 如果没有,但是找到了
,则导入并返回一个模块。扩展的确切列表因平台和是否指定了/foo.{py,pyc,so,pyd}
标志而不同。这里的清单很有代表性-O
- 如果未找到,但找到了
,并且是一个目录,则会记录该目录,并继续扫描父路径中的下一个目录/foo
- 否则,将继续扫描父路径中的下一个目录
位于sys.path
中,则导入foo
可能对应于/foo
,即使没有/foo/\uuuu init\uuuu.py
。因此,接受pep,与使用名称空间包的好处相比,由于意外的导入foo成功而可能造成混淆的风险被认为太小
除非您打算提供一个名称空间包,例如,插件模块能够将它们放在不同的目录中(可作为不同的操作系统包安装),否则您应该始终为Python包提供
\uuuu init\uuuuuuuupy
——显式比隐式好。我尝试了@Martijn示例,事实上是“图像”即使没有任何init.py文件,目录也被导入了,这只是因为在搜索路径的前面找到了它。我以为只导入了包含init.py文件的目录。@tt0686:是的,如果没有images/\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuusys.path
中的images
目录可以使导入图像
成功:“如果
位于sys.path
中,则导入foo
可能对应于/foo
,即使没有/foo/\uu init\uuuuuuuuuuuy
”但是,不使用任何语句或方法导入某些内容又有什么意义呢?仅仅是一个目录?@tt0686:read例如,“提供一个名称空间包,例如,插件模块能够将它们放在不同的目录中(可以安装为不同的操作系统包)”,这意味着在以前的Python版本中(在名称空间包之前),没有init.py文件的目录将不会被导入,对吗?