模块无法导入_模块相互import引发的惨案

ae94df97f61ed18842a468967452ffa7.gif

a.py

from b import fun_bdef fun_a():    pass

b.py

from a import fun_adef fun_b():    pass

执行a.py会发生什么呢?fun_b无法被导入。

不管是import module 还是from module import xx,这些都是可执行语句,被执行时:

  • 如果sys.modules中不存在该模块,就会创建该模块的实例并且去执行该模块的代码,在所有代码执行完后才把控制权交给调用方。

  • 如果sys.modules存在该模块,就会直接返回该模块对象,无论该被导入模块的所有代码是否被执行。这就是为什么互相导入可能无法找到被import模块中对象的原因。

Follow上面的rule,我们看看遍执行a.py时程序做了什么?

  1. 代码执行from b import fun_b,发现sys.modules里没有b模块的记录,所以创建b模块实例开始执行b模块的代码。

  2. 在b模块里代码执行from a import fun_a,发现sys.modules里没有a模块的记录,所以创建a模块实例执行a模块的代码,所以这里程序并没有执行b后面的代码去定义fun_b而是把控制权交给了a模块。

  3. a模块又来到了from b import fun_b,但是sys.modules已经有了b模块对象,所以不会再次执行b模块的代码,但是因为b模块的fun_b函数对象没有执行到,所以就找不到该对象而报出异常

a4d58263b886f6eaee74c00f775e86c0.png 31f52772f69fa81fea08870aaa5f09f3.png

听说关注我们的人 都升职加薪啦

你要做的

无非是

长按关注

caa9d679cd50dbe22ee1061b62615a0b.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值