首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隐藏真实模块

隐藏真实模块
EN

Stack Overflow用户
提问于 2014-09-25 11:34:21
回答 2查看 185关注 0票数 0

主题是包导入和__init__文件:规范中有一个引号:

这些文件有助于防止具有公共名称的目录无意中隐藏稍后在模块搜索路径上出现的真正模块。如果没有这种保障,Python可能会选择一个与代码无关的目录,仅仅因为它看起来嵌套在搜索路径上的早期目录中。

你能给我举个例子吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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__.pyimport foo也可能对应于<directory>/foo。因此,pep被接受,因此,与拥有命名空间包相比,由于意外的import foo成功而可能出现混乱的风险被认为太小了。

除非您打算提供名称空间包,例如,插件模块能够将它们放在不同的目录中(可作为不同的OS包安装),否则您应该始终为您的Python包提供__init__.py --显式比隐式好。

票数 1
EN

Stack Overflow用户

发布于 2014-09-25 11:38:29

如果允许将任何目录视为包,则尝试导入同时作为目录和搜索路径上的模块存在的模块可以选择该目录而不是模块。

假设您有一个images目录和一个images.py模块。如果在前面的搜索路径上找到了import images目录,那么它将找到它。

通过要求__init__.py标记包,您可以在您的Python代码旁边包含这样的数据目录,而不必担心屏蔽同名的真正模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26037592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档