为何urllib.request模块属性首次访问失败,二次访问却成功?
现象原因解析
这个问题的核心是Python的模块懒加载机制,具体过程是这样的:
- 当你执行
import urllib时,Python只会加载urllib顶层模块本身,不会自动加载它的子模块(比如urllib.request)。所以第一次访问urllib.request时,这个子模块还没被加载到内存里,自然会抛出AttributeError。 - 有意思的是,第一次报错触发的异常回溯过程中,Python解释器会访问到
urllib.request相关的模块信息,这个过程会隐式地完成子模块的导入,并把request绑定成urllib模块的属性。 - 等到第二次访问
urllib.request时,这个子模块已经被加载完成,所以就能正常返回对应的模块对象了。
如果想避免这种情况,直接显式导入子模块就行:import urllib.request,或者用from urllib import request,这样一开始就能正常访问。
内容的提问来源于stack exchange,提问作者John Gordon
相关产品推荐
相关产品推荐

