循环导入问题

风格不统一 提交于 2019-11-27 10:40:00

循环导入问题

一、什么是循环导入

# m1.py """ @author RansySun @create 2019-08-15-15:45 """ print("m1中正在导入m2") from m2 import y  x = 'm1' print("m1中y:", y)
  1. 创建m2的名称空间
  2. 执行m2.py,将执行产生的名字丢到m2.py
  3. 在当前执行文件中拿到m2.x
# m2.py """ @author RansySun @create 2019-08-15-15:45 """ print("m2中正在导入m1") from m1 import x  y = 'm2'  print("打印m2中引用的x:", x)
  1. 创建m1的名称空间
  2. 执行m1.py,将执行产生的名字丢到m1.py
  3. 在当前执行文件中拿到m1.y
# run.py import m1
  1. 创建m1的名称空间
  2. 执行m1.py,将执行产生的名字丢到m1.py
  3. 在当前执行文件中拿到m1

m1中正在导入m2
m2中正在导入m1
m1中正在导入m2

Traceback (most recent call last):

ImportError: cannot import name 'y' from 'm2' ( 模块循坏导入问题\m2.py)

分析原因:

  1. 首先运行run.py—>import m1,开始导入m1并运行其内部代码--->打印内容m1中正在导入m2--->执行from m2 import y 开始导入m2并运行其内部代码---->打印内容m2中正在导入m1 --->执行from m1 import x,由于m1已经被导入过了,所以不会重新导入,所以直接去m1中拿x然而此时x,并没有存在于m1中,而是模块之间循环调用,所以会报错

二、解决方案

我们可以使用函数定义阶段只识别语法的特性解决循环导入的问题,我们也可以从本质上解决循环导入的问题,但是最好的解决方法就是不要出现死循环

2.1方案一

# m1 print("m1中正在导入m2") x = 'm1' from m2 import y   print("m1中y:", y)
print("m2中正在导入m1") y = 'm2' from m1 import x    print("打印m2中引用的x:", x)

结果:

m1中正在导入m2
m2中正在导入m1
已经找到!
m1中正在导入m2
m1中y: m2
已经找到!2
打印m2中引用的x: m1
m1中y: m2

分析:先运行m1 —>打印m1中正在导入m2—>m2中找x-->打印m2中正在导入m1, 接着打印已经找到!-->之后回到m1中继续运行--->打印m1中正在导入m2--->接着打印m1中y: m2—->之后会回到m2中执行剩下的代码--->执行到from m1 import x-->到m1中找到继续回到m2中---->接着打印已经找到!2--->打印打印m2中引用的x: m1-->回到m1中继续执行余下的代码

2.1 方案二

# m1 print("m1中正在导入m2") x = 'm1' def func1():      from m2 import y       print("m1中y:", y)
# m2 print("m2中正在导入m1") y = 'm2' def func2():     print("已经找到func2!")      from m1 import x      print("已经找到!2")      print("打印m2中引用的x:", x)

结果:

m1中正在导入m2
m2中正在导入m1
m1中y: m2

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!