Python 中循环 import 造成的问题如何解决?

业务模块B 业务公用模块BCommon(比如说推荐系统,可以推荐B,C...等等,所以要用到B中的Model) 在业务模块B中,业务处理需要用到B…


作者:灵剑

链接:https://www.zhihu.com/question/19887316/answer/119484887

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先出现这种问题是因为没有规划好层级,哪些模块和哪些模块逻辑上应该在一起,哪些模块是公共的依赖项,哪些是实际的业务代码,按你的需求,显然B.Model应该是一个独立的模块才对,把第一和第三层合成一个模块然后把第二层独立出去就会出现你这种情况。循环引用是小问题,代码以后难维护、理不清实现的逻辑才是大问题。

其次,Python根本就是可以循环引用的,只要你循环引用中的模块并不是在定义阶段就马上使用,比如:

#module1.pyimportmodule2classModel(object):defdo_something(self):module2.print_model(self)#module2.pyimportmodule1defprint_model(model):printrepr(module1.Model())

两个import其中的一个在导入时会为空,取决于import顺序,但由于只有在函数内部使用,只要import阶段没有执行到相应的位置就不会有问题。也就是说出现这种情况时只要避免三种使用方法:

from ... import ... (这个去掉肯定没啥问题)

直接执行的代码(本来大部分情况下你都应该避免的)

类的继承(基类的模块去import派生类的模块本来就很奇怪啊)

将import放到函数里面,放到最下面,都可以解决问题,但治标不治本,治本的还是要重新划分模块,逻辑理顺了就不会出现循环import

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 模块通常是指编程语言所提供的代码组织机制,利用此机制可将程序拆解为独立且通用的代码单元。所谓模块化主要是解决代码分...
    MapleLeafFall阅读 1,194评论 0 0
  • Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载...
    zhoulujun阅读 2,952评论 0 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 前面的话   JS用"共享一切"的方法加载代码,这是该语言中最易出错且容易令人感到困惑的地方。在ES6以前,在应用...
    CodeMT阅读 2,932评论 0 5
  • 最近都在好好的学开车,开得很慢,可以慢但不能停,一定要胆大心细,多去尝试。但是安全第一,一定要慢,遇到紧急情况要冷...
    阑十三阅读 402评论 0 11