栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Python的__import__需要fromlist?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Python的__import__需要fromlist?

实际上,的行为

__import__()
完全是由于
import
调用的执行
__import__()
。基本上有五种不同的
__import__()
调用方式
import
(有两个主要类别):

import pkgimport pkg.modfrom pkg import mod, mod2from pkg.mod import func, func2from pkg.mod import submod

在第一种 第二种情况下,该

import
语句应将“最左侧”模块对象分配给“最左侧”名称:
pkg
。之后,
importpkg.mod
您可以执行
pkg.mod.func()
该操作,因为该
import
语句引入了本地名称
pkg
,这是具有
mod
属性的模块对象。因此,该
__import__()
函数必须返回“最左侧”模块对象,以便可以将其分配给
pkg
。因此,这两个导入语句转换为:

pkg = __import__('pkg')pkg = __import__('pkg.mod')

在第三,第四和第五种情况下,该

import
语句必须做更多的工作:它必须(可能)分配多个名称,这必须从模块对象中获取。该
__import__()
函数只能返回一个对象,没有真正的理由让它从模块对象中检索每个名称(这会使实现变得更加复杂。)因此,简单的方法应类似于(对于第三个)案件):

tmp = __import__('pkg')mod = tmp.modmod2 = tmp.mod2

但是,如果

pkg
是包,
mod
或者
mod2
是该包 中尚未导入的
模块(如在第三种和第五种情况下),那将不起作用。该
__import__()
功能需要知道
mod
mod2
是名字的
import
声明都希望能够获得访问,以便它可以看到,如果他们是模块和尝试导入他们。因此,电话更接近:

tmp = __import__('pkg', fromlist=['mod', 'mod2'])mod = tmp.modmod2 = tmp.mod2

这会导致

__import__()
尝试和负载
pkg.mod
pkg.mod2
以及
pkg
(但如果
mod
还是
mod2
不存在,它不是在错误
__import__()
的呼叫;产生一个错误是留给
import
。声明),但还不是第四和正确的事第五个示例,因为如果调用是这样的:

tmp = __import__('pkg.mod', fromlist=['submod'])submod = tmp.submod

那么

tmp
最终将
pkg
像以前一样是,而不是
pkg.mod
submod
要从中获取属性的模块。该实现可能已经决定要这样做,所以该
import
语句会做更多的工作,
.
__import__()
已经在函数中那样拆分程序包名称并遍历名称,但这将意味着重复一些工作。所以,相反,执行方面取得
__import__()
返回
最右边的 模块,而不是 最左边的 一个 当且仅当 fromlist里传递,而不是空。

import pkg as p
and
from pkg import mod as m
语法对这个故事没有任何改变,只是将本地名称分配给了它-
使用该
__import__()
函数时
as
并没有什么不同,它们都保留在
import
语句实现中。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646446.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号