## 先来说一个总结:
循环导入的最好解决办法是从架构上优化,及调整模块和模块成员变量的设计。一个好的原则是:可导出的成员变量,都不应该依赖于导入进来的成员变量。
但是在业务开发的过程中,总会遇到通过架构层面解决不了的导入问题,或者写完后推倒重来的代价太大,所以就要学会**屎上雕花**,通过语言来解决。
目录结构如下:
```python
run.py
/pack1
__init__.py
m1.py
/pack2
__init__.py
m2.py
```
## 什么是循环导入?举个例子
run.py
```python
from pack1.m1 import x
```
m1.py
```python
print "运行m1..."
from pack2.m2 import y
x=111
```
m2.py
```python
print "运行m2..."
from pack2.m1 import x
y=222
```
这样写一定会报错..........
代码执行的流程:
1、执行run.py的 from pack1.m1 import y,发现需要导入模块m1
2、执行m1代码,创建一个m1的名称空间,存放m1中的变量名
3、执行m1期间,当执行到 from pack2.m2 import x时,发现需要导入模块m2
4、执行m2代码,创建一个m2的名称空间,存放m2中的变量名
5、m2执行期间,当执行到 from pack1.m1 import y时,发现需要导入模块m1,但在<u>过程2</u>中已经有m1的名称空间所以不会再创建,这时的m2需要访问x这个变量值,但名称空间m1中没有x这个变量,所以抛出异常。
## 解决方案
### 雕花方案一:
将所有变量的定义提前,最后在导入模块。在循环导入未发生前将所有变量内存存入名称空间,很明显这样看着不大舒服,用起来也费劲。
### 雕花方案二:
将导入语句放在需要用到它的函数内部,因为在python中,函数定义阶段不会执行函数体代码,只有调用阶段才执行,这样也可以避免。
### 其他方案三:
使用import代替 from...import...:确实可以解决,但每次用都要将路径写全,非常麻烦。