您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么Python的__import__需要fromlist?

为什么Python的__import__需要fromlist?

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

import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod

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

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

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

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

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

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

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

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

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

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

python 2022/1/1 18:41:49 有278人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶