加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 为什么`sys.modules.keys()`包含来自`import … as`的

发布时间:2020-12-20 12:23:53 所属栏目:Python 来源:网络整理
导读:假设我导入一个模块如下: import os as OSMOD 然后想找到工作目录 OSMOD.getcwd() OSMOD现在是os的替代品,使用os不起作用.这都是花花公子,对我有用.但是,我发现有些奇怪的东西.如果我像上面那样导入操作系统,然后获取所有导入模块的列表,那么会发生以下情况
假设我导入一个模块如下:

import os as OSMOD

然后想找到工作目录

OSMOD.getcwd()

OSMOD现在是os的替代品,使用os不起作用.这都是花花公子,对我有用.但是,我发现有些奇怪的东西.如果我像上面那样导入操作系统,然后获取所有导入模块的列表,那么会发生以下情况:

>>> import sys
>>> import os as OSMOD
>>> modList = sys.modules.keys()
>>> print "os" in modList
True
>>> print "OSMOD" in modList
False

这不是我的预期.根据docs modules.keys()只列出导入的模块.对我来说,这意味着它应该列出OSMOD.

为什么sys.modules.keys()不包含OSMOD而不是os?

另外,sys.modules.keys()是否有一个包含OSMOD的等效列表?

编辑:我想这里更大的问题是理由.如果Python要将os作为模块,为什么要删除引用呢? (也就是说,为什么os.getcwd()和OSMOD.getcwd()都不起作用?)

或者,更简单地说,为什么不导入操作系统,因为OSMOD的行为与导入操作系统相同,后跟OSMOD = os?

解决方法

您似乎对模块对象和对该对象的引用感到困惑. sys.modules [‘os’]是对模块对象的一个??引用,OSMOD是另一个.

当您使用语句import os作为OSMOD时,Python确保将os模块加载到内存中(使用sys.modules字典作为缓存),然后在当前名称空间中创建对模块对象的引用.因为您使用OSMOD Python看到您想要使用名称OSMOD并将模块绑定到该名称.

如果您使用了import os,那么Python将默认为与模块相同的名称,因此它将对象绑定到本地命名空间中的os.

你绝不会受到限制.您仍然可以将同一对象绑定到其他名称:

os = OSMOD

会给你另一个对同一个模块对象的引用.

请记住,您的模块全局命名空间仅对模块是全局的;其他模块看不到相同的名称.因此,您希望控制在其中定义的名称.也许你想完全使用名称os作为其他东西.以下是合法的:

os = 'Ozzy Santana'
import os as OSMOD

我希望os仍然绑定到字符串,而不是模块.

同时,我的Python项目中的另一个模块仍然可以使用import os并且os可以引用该模块;它不会在第一个模块中看到绑定到os的字符串.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读