当前位置: 首页 > 面试题库 >

为什么sys.modules中有虚拟模块?

欧阳德运
2023-03-14
问题内容

导入标准“日志记录”模块会对一堆虚拟条目造成sys.modules污染:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
>>> import sys
>>> import logging
>>> sorted(x for x in sys.modules.keys() if 'log' in x)
['logging', 'logging.atexit', 'logging.cStringIO', 'logging.codecs', 
'logging.os', 'logging.string', 'logging.sys', 'logging.thread', 
'logging.threading', 'logging.time', 'logging.traceback', 'logging.types']

# and perhaps even more surprising:
>>> import traceback
>>> traceback is sys.modules['logging.traceback']
False
>>> sys.modules['logging.traceback'] is None
True

因此,导入此软件包会将额外的名称放入sys.modules中,除了它们不是模块以外,仅引用None。其他模块(例如xml.dom和编码)也有此问题。为什么?

编辑:
在bobince的答案的基础上,有一些页面描述了功能的起源(请参阅“
sys.modules中的虚拟条目”部分)和功能的未来。


问题答案:

None中的值sys.modules是相对查找的缓存失败。

因此,当您处于打包状态fooimport sys,Python会首先查找foo.sys模块,如果失败,则转到顶级sys模块。为了避免foo/sys.py在进一步的相对导入中再次检查文件系统,它Nonesys.modulesto标志中存储该模块不存在,并且随后的导入不应该再出现在该位置,而直接进入已加载sys

这是您无法有效依靠的cPython实现细节,但是如果您要进行令人讨厌的魔术导入/重新加载黑客操作,则需要了解它。

它适用于所有软件包,而不仅仅是logging。例如,在尝试从inside导入时import xml.dom,请xml.dom.xml在模块列表中查看。xml``xml.dom

随着Python迈向绝对导入,这种丑陋的发生将越来越少。



 类似资料:
  • 问题内容: 我知道虚函数具有取消引用调用方法的开销。但是我想以现代建筑的速度几乎可以忽略不计。 为什么C ++中的所有函数都不像Java中的虚拟函数那样有特定的原因? 据我所知,在基类中定义虚拟函数是足够/必要的。现在,当我编写父类时,我可能不知道哪些方法会被覆盖。这是否意味着在编写子类时,有人必须编辑父类。这听起来不方便,有时甚至不可能? 更新: 以下是乔恩·斯凯特(Jon Skeet)的回答:

  • 在Azure中,有2个选项可用于创建虚拟机。A、 普通VM B.经典VM 有人知道这两种选择有什么区别吗?我们什么时候使用一个而不是另一个?

  • 问题内容: 我希望有人能够提供一些有关Java虚拟机的根本差异的见解,从而使Java虚拟机可以很好地实现线程而无需使用全局解释器锁(GIL),而Python则需要这样做。 问题答案: Python(该语言)不需要GIL(这就是为什么它可以在JVM [Jython]和.NET [IronPython]上完美实现的原因,并且这些实现可以自由地使用多线程)。CPython(流行的实现)一直使用GIL来简

  • VMware虚拟机nat模式,虚拟机可以和宿主机互通,外网也通,路由器能ping通宿主机,但是ping不通虚拟机和宿主机的VMnet8网卡地址怎么回事? 宿主机IP:192.168.2.85 虚拟机IP:192.168.2.100 VMnet8网卡IP:192.168.2.9 路由器能ping通192.168.2.85,但是2.100和2.9ping不通

  • 简单地说,虚拟机(Virtual Machine)就是允许我们在当前操作系统中运行其他操作系统的软件,本质上和 VS、QQ 这些应用程序一样。 所以,只要我们在电脑(PC 或笔记本等)上安装好虚拟机软件,就可以模拟出来若干台相互独立的虚拟 PC 设备,每一个都如何一台真实的计算机。在此基础上,我们可以给每台虚拟的 PC 设备安装指定的操作系统,这样就可以实现在一台电脑上同时运行多个操作系统。 另外

  • 本文向大家介绍什么是虚拟DOM?相关面试题,主要包含被问及什么是虚拟DOM?时的应答技巧和注意事项,需要的朋友参考一下 虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在react,vue等技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom 然后修改样式行为或者结构,来达到更新 ui 的目的。 这种方式相当消耗计算资源,因为每次查询 dom 几