[Python]导入循环问题
来源:互联网 发布:淘宝药房旗舰店 编辑:程序博客网 时间:2024/05/18 22:14
一、导入循环
在大型的Python工程中,由于架构设计不当,可能会出现模块间相互引用的情况。
这时候需要通过一些方法来解决这个问题.
(1)重新设计架构,解除相互引用的关系。
(2)把import语句放置在模块的最后
(3)把import语句放置在函数中
1、重新设计架构,解除相互引用
-------- 后续补充 ---------
2、把import语句放置在模块最后
-------- 后续补充 ---------
从Traceback看,两个模块互相导入,造成导入循环错误。
在大型的Python工程中,由于架构设计不当,可能会出现模块间相互引用的情况。
这时候需要通过一些方法来解决这个问题.
(1)重新设计架构,解除相互引用的关系。
(2)把import语句放置在模块的最后
(3)把import语句放置在函数中
1、重新设计架构,解除相互引用
-------- 后续补充 ---------
2、把import语句放置在模块最后
-------- 后续补充 ---------
3、把import语句放置在函数中
例子:一个系统由两部分组成,包括control主模块和submodule模块。其中control模块包含ctlCommon()和control(),submodule模块包含submodule(),并且在submodule()中会用到ctlCommon()。
# control.pyfrom submodule import submoduledef ctlCommon(): print("enter ctlCommon")def control(): print("-------Enter control-------") submodule() print("++++++++Exit control+++++++")control()
# submodule.pyimport controldef submodule(): print("enter submodule calling ctlCommon") control.ctlCommon()分析1:执行control.py
从Traceback看,两个模块互相导入,造成导入循环错误。
$ python control.py # 执行control.pyTraceback (most recent call last): File "D:\SelfStudy\PythonStudy\grammar\basic usage\module\control.py", line 2, in <module> from submodule import submodule File "D:\SelfStudy\PythonStudy\grammar\basic usage\module\submodule.py", line 2, in <module> import control File "D:\SelfStudy\PythonStudy\grammar\basic usage\module\control.py", line 2, in <module> from submodule import submoduleImportError: cannot import name 'submodule'方案:把submodule.py中的导入模块语句放在函数中
# submodule.pydef submodule(): import control print("enter submodule calling ctlCommon") control.ctlCommon()
结果分析:为了更好的理解执行过程,我们把submodule()在control()函数中展开。
执行control.py,会去执行control()函数。control()函数的执行步骤:
step1、执行(a)
step2、import control,由于是第一次导入(import),会加载(load)该模块。
该模块的导入代码会被执行,因此执行一次control()函数。结果中黑色加粗的部分。
step3、顺序执行(b), (c), (d)
def control(): print("-------Enter control-------") # (a) #submodule() # 把submodule()函数展开 import control print("enter submodule calling ctlCommon") # (b) control.ctlCommon() # (c) print("++++++++Exit control+++++++") # (d)
$ python control.py # 执行control.py-------Enter control------- #(a)-------Enter control-------enter submodule calling ctlCommonenter ctlCommon++++++++Exit control+++++++enter submodule calling ctlCommon # (b)enter ctlCommon # (c)++++++++Exit control+++++++ # (d)
分析2:执行submodule.py
$ python submodule.py-------Enter control------- # (a)enter submodule calling ctlCommonenter ctlCommon++++++++Exit control+++++++ # (d)
结果分析:
执行submodule模块,首先去导入和加载control模块
#import control # 第一次导入会去执行顶层目录代码,也就是说会去执行control()control() # control中会先执行打印(a), 然后调用submodule(), 最后执行打印(d)def submodule(): print("enter submodule calling ctlCommon") control.ctlCommon()
0 0
- python 导入循环问题
- python 导入循环问题
- [Python]导入循环问题
- python导入循环问题
- OC循环导入问题
- python 导入库问题
- python 模块导入问题
- Python相对导入问题
- python中的for循环问题
- Python for循环小问题
- python 模块导入问题详解
- Python 模块导入路径问题
- python导入文件出现问题
- [python笔记]for循环中循环变量迭代问题
- Python循环依赖问题的解决
- jeseph问题,python实现, 循环链表
- Python 简单循环实现汉诺塔问题
- OC中循环导入的问题,及解决办法.
- 最小边权和
- C++第五次上机实验-成绩
- POJ1847 Tram(最短路径)
- 单元测试
- bzoj 3513: [MUTC2013]idiots (FFT)
- [Python]导入循环问题
- 一张图看懂单机部署+集群部署+热备部署与磁盘阵列(RAID)
- 浅谈Windows共享网络热点开发
- CentOS7在桥接模式下配置静态ip
- JavaScript设计模式--单例模式
- tensorflow的基本用法
- tensorflow存取,读取,及保存的文件的含义
- Android Fragment间通信
- iOS获取设备唯一标识符