Effective Python 读书笔记: 第52条: 用适当的方式打破循环依赖关系

# -*- encoding: utf-8 -*-

import os

'''
第52条: 用适当的方式打破循环依赖关系

关键:
1 相互依赖
解释:A文件引用B文件中的内容,B文件又引用了A文件中的内容
后果: 循环依赖会抛出异常那个
问题原因:
python的import有详细机制。引入模块时会按照深度优先顺序
执行下列操作:
1) 从sys.path指定路径中查找待引入的模块
2) 从模块中加载代码并保证代码能够编译
3) 创建与该模块相对应的空对象
4) 将空模块对象添加到sys.modules中
5) 运行模块对象中的代码,定义其内容
总结:
查找模块->加载模块代码,创建模块的空对象->运行模块对象的代码
查找,加载,运行

2 循环依赖带来的问题
假设A模块引入B模块。B模块又引入A模块。
那么A模块未定义任何内容,即A未完成整个引入过程,
此时A是空模块,但是B又引入A模块中的内容,但是A此时是空模块,
就会报错。

3 循环依赖解决办法
方法1: 调整引入顺序。
    在需要使用的地方而非开始部分就采用import 语句。不推荐,违反pep8
方法2: 先引入、再配置、最后运行。
    减少模块引入时所产生的副作用。不要再引入时真正运行那些函数。
    每个模块提供configure函数,模块引入完成后,在该模块调用一词configure。
方法3: 动态引入
    在函数或方法内部使用import语句。在真正需要import的时候,才引入对应模块。

4 总结
两个模块互相调用对方会出现循环依赖翁提。解决循环依赖的最佳方法时
把两个模块相互依赖的代码重构为单独模块并放在依赖树的底部。
最简单的方式就是动态引入,即真正用到待引入的模块时,才在函数中引入该模块。

参考:
Effectiv Python 编写高质量Python代码的59个有效方法
'''


def process():
    pass


if __name__ == "__main__":
    process() 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值