前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么Python的__import__需要fromlist?

为什么Python的__import__需要fromlist?

作者头像
星星在线
发布2019-07-12 15:39:37
1.2K0
发布2019-07-12 15:39:37
举报

在Python中,如果要以动态方式导入模块,可以执行以下操作:

代码语言:javascript
复制
module = __import__('module_name')

如果要导入子模块,你可能认为这只是一个简单的问题:

代码语言:javascript
复制
module = __import__('module_name.submodule')

结果呢,当然不起作用了,你必须这么做:

代码语言:javascript
复制
module = __import__('module_name.submodule', fromlist=['xxx'])

为什么?实际值fromlist似乎根本不重要,只要它不是空的就行。

实际上,__import__内部也是import来实现的。 那么我们在使用import的时候,一般有以下五种方式:

代码语言:javascript
复制
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。这两种情况相当于

代码语言:javascript
复制
pkg = __import__('pkg')
pkg = __import__('pkg.mod')

后面三种情况,import就必须做更多的工作了,它必须从模块对象获取并分配多个名称。但是__import__函数只能返回一个对象,并且它不能从模块对象中检索出多个名字,所以对于第三种情况就是:

代码语言:javascript
复制
pkg = __import__('pkg')
mod = pkg.mod
mod2 = pkg.mod2

但是如果mod和mod2在该模块pkg中尚未导入,那将无法生效。__import__函数需要知道mod和mod2是它可以访问的名称,以便它可以查看他们是否是模块并且尝试导入他们。所以像一下这个方式更为接近:

代码语言:javascript
复制
pkg = __import__('pkg', fromlist=['mod', 'mod2'])
mod = pkg.mod
mod2 = pkg.mod2

这会导致__import__先尝试pkg.mod和pkg.mod2,如果不生效的话,它并不会抛出异常。但是第五种例子按照以上方式依然不行:

代码语言:javascript
复制
tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod

我们希望tmp是pkg.mod模块,但实际上它还是pkg模块。如果是按照我们想的这种方式去加载,那就要增加更多额外的解包工作。所以它就直接返回了最右边的模块,当且仅当fromlist里面不是空的时候

总结

__import__函数中的fromlist实际上是没有具体含义的,你可以理解为它只是一种标记,当它不为空的时候,import将为我们导入前面所写的字符串中最右边的模块。当它为空的时候,import将为我们导入字符串最左边的模块,仅此而已。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爬虫实战之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档