# python的循环导入问题及优化方案

## 先来说一个总结: 

​    循环导入的最好解决办法是从架构上优化,及调整模块和模块成员变量的设计。一个好的原则是:可导出的成员变量,都不应该依赖于导入进来的成员变量。

​    但是在业务开发的过程中,总会遇到通过架构层面解决不了的导入问题,或者写完后推倒重来的代价太大,所以就要学会**屎上雕花**,通过语言来解决。

目录结构如下:

```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...:确实可以解决,但每次用都要将路径写全,非常麻烦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值