python 模块相互import会出问题

摘要:
RobertChen:这跟Python内部import的机制是有关的,具体到fromBimportD,Python内部会分成几个步骤:在sys.modules中查找符号”B”如果符号B存在,则获得符号B对应的module对象。

copy:https://blog.csdn.net/sinat_38682860/article/details/105497154?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control

摘抄如下:就当做个笔记

模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下:

python 模块相互import会出问题第1张

为什么执行A的时候不能加载D呢?

如果将A.py改为:import B就可以了。

这是怎么回事呢?

RobertChen:这跟Python内部import的机制是有关的,具体到from B import D,Python内部会分成几个步骤:

在sys.modules中查找符号”B”

如果符号B存在,则获得符号B对应的module对象< module B>。
从 < module B> 的__ dict__中获得符号”D”对应的对象,如果”D”不存在,则抛出异常
如果符号B不存在,则创建一个新的module对象< module B>,注意,这时,module对象的__ dict__为空。

执行B.py中的表达式,填充的__dict__ 。

从< module B>的__ dict__中获得”D”对应的对象,如果”D”不存在,则抛出异常。
所以,这个例子的执行顺序如下:

1、执行A.py中的from B import D

由于是执行的python A.py,所以在sys.modules中并没有< moduleB>存在,首先为B.py创建一个module对象(< moduleB>),注意,这时创建的这个module对象是空的,里边啥也没有,在Python内部创建了这个module对象之后,就会解析执行B.py,其目的是填充< module B>这个dict。

2、执行B.py中的from A import C

在执行B.py的过程中,会碰到这一句,首先检查sys.modules这个module缓存中是否已经存在< moduleA>了,由于这时缓存还没有缓存,所以类似的,Python内部会为A.py创建一个module对象(< moduleA>),然后,同样地,执行A.py中的语句。

3、再次执行A.py中的from B import D

这时,由于在第1步时,创建的< moduleB>对象已经缓存在了sys.modules中,所以直接就得到了< moduleB>,但是,注意,从整个过程来看,我们知道,这时< moduleB>还是一个空的对象,里面啥也没有,所以从这个module中获得符号”D”的操作就会抛出异常。如果这里只是importB,由于”B”这个符号在sys.modules中已经存在,所以是不会抛出异常的。

上面的解释已经由Zoom.Quiet收录在啄木鸟了,里面有图,可以参考一下:

python 模块相互import会出问题第2张

免责声明:文章转载自《python 模块相互import会出问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java多线程学习之任务的创建以及在线程中执行任务SQL SERVER事务处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ansible使用jinja2模板

jinja2基本语法 控制结构 {% %}             jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典          2.变量取值 {{ }}             jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/...

Python读取PDF文档

1 from pdfminer.converter import PDFPageAggregator 2 from pdfminer.layout import LAParams 3 from pdfminer.pdfparser import PDFParser 4 from pdfminer.pdfparser import PDFDocume...

python中常用的文件和目录操作(二)

一. os模块概述 python os模块提供了非常丰富的方法用来处理文件和目录 二. 导入os模块: import os 三. 常用方法 1. os.name 输出字符串表示正在使用的平台,如果是windows则用"nt"表示,如果是Linux/Unix,是"posix" import os print(os.name) 结果: nt...

【Python之路】特别篇--ECMA对象、DOM对象、BOM对象

ECMA对象从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。 ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。 var o = new Object(); 对象的概念与分类: 由ECMAScript定义的本地对象.独立于宿主环境的 ECMAS...

python pip安装第三方模块

一、pip工具使用 安装windows版本python,自带pip工具。2者路径相同。 如果设置了环境路径,可以直接在命令提示符窗口下尝试运行pip。如果没有设置环境路径,可以先cd命令到pip工具的安装文件夹下,再运行pip。 安装Pillow模块: pip install Pillow 二、批量安装常用模块 安装Anaconda。 三、模块搜索路径 1...

Python:匿名函数lambda的函数用法和排序用法

一、介绍: Lambda函数,是一个匿名函数,创建语法:  lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数。 expression:不能包含分支或循环(但允许条件表达式),也不能包含return(或yield)函数。如果为元组,则应用圆括号将其包含起来。 调用lambda...