主题是包导入和__init__文件:规范中有一个引号:
这些文件有助于防止具有公共名称的目录无意中隐藏稍后在模块搜索路径上出现的真正模块。如果没有这种保障,Python可能会选择一个与代码无关的目录,仅仅因为它看起来嵌套在搜索路径上的早期目录中。
你能给我举个例子吗?
发布于 2014-09-25 12:54:27
在当前的Python文档中没有这样的引用。
PEP 420隐式命名空间包(Python 3.3+)指定
<directory>/foo/__init__.py,则导入并返回一个常规包。<directory>/foo.{py,pyc,so,pyd},则导入并返回一个模块。扩展的确切列表因平台和是否指定-O标志而不同。这里的名单很有代表性。<directory>/foo,并且是一个目录,它将被记录下来,扫描将继续到父路径中的下一个目录。也就是说,如果<directory>在sys.path中,那么即使没有<directory>/foo/__init__.py,import foo也可能对应于<directory>/foo。因此,pep被接受,因此,与拥有命名空间包相比,由于意外的import foo成功而可能出现混乱的风险被认为太小了。
除非您打算提供名称空间包,例如,插件模块能够将它们放在不同的目录中(可作为不同的OS包安装),否则您应该始终为您的Python包提供__init__.py --显式比隐式好。
发布于 2014-09-25 11:38:29
如果允许将任何目录视为包,则尝试导入同时作为目录和搜索路径上的模块存在的模块可以选择该目录而不是模块。
假设您有一个images目录和一个images.py模块。如果在前面的搜索路径上找到了import images目录,那么它将找到它。
通过要求__init__.py标记包,您可以在您的Python代码旁边包含这样的数据目录,而不必担心屏蔽同名的真正模块。
https://stackoverflow.com/questions/26037592
复制相似问题