【问题标题】:Executing `from abc import xyz` where does the module `abc` go?执行 `from abc import xyz` 模块 `abc` 去哪里了?
【发布时间】:2016-07-28 15:20:52
【问题描述】:

关于 Python 内部的问题。如果我执行import abc,那么 Python 会将模块读入一个新的命名空间,并将全局命名空间中的变量 abc 绑定到新的命名空间。

如果我执行from abc import xyz,那么它会将整个模块abc 读取到某个新的命名空间中,然后将全局命名空间中的变量xyz 绑定到在这个新创建的命名空间中绑定到xyz 的同一个对象模块被读入的位置。至少这是我的理解。

之后读入abc 的命名空间会发生什么情况?我假设它存在于某个地方,因为xyz 可能会访问该命名空间中的其他对象。这个“幽灵”abc 命名空间可以通过某种方式访问​​吗?

另外,我假设如果我这样做了

from abc import xyz
from abc import fgh

那么abc命名空间只有一个“幽灵”,所以如果xyzfgh修改abc中的同一个全局变量,就只有一份。对吗?

【问题讨论】:

  • 这只是出于好奇吗?没有真正的理由尝试像这样“秘密”访问模块;如果要访问模块对象,只需正常导入即可。
  • 只是出于好奇,试图了解事情在幕后是如何运作的。我做了很多数据工作,考虑将其中一些工作从 R 转移到 Python,所以只是建立一个理解。

标签: python module namespaces


【解决方案1】:

模块对象存储在sys.modules。所以如果你做from abc import xyz,那么sys.modules['abc']会给你abc模块对象。

【讨论】:

  • 另外,如果xyz 依赖于abc,它可能有自己对模块全局变量的引用。例如,如果xyz 是一个函数,则xyz.__globals__ 将是abc.__dict__,并且删除sys.modules 条目不会使xyz 失去对其的访问权限(尽管它会产生其他奇怪的效果)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多