python中怎么样实现交叉importation
最近写毕业论文很痛苦,答一下这题复习一下python来换换脑子...
题主在问题中描述的这种import方式一般被称为circular import,即两个.py file相互import彼此。虽然python不会因为这种circular import而陷入一个无限循环当中,但是需要注意的是当import个module的时候,会按照从上到下的顺序执行module中处在top level的statements。所以当A执行到import语句来import另外一个模块B的时候,A模块import语句那一行以下的name可能还不存在。这个时候若从B中import A并且调用这些name就会出现问题。
按照题主的意思举个例子。
第一个文件:# a.pyarg = 1print(\u0026#39;in a.py, before import b\u0026#39;)import bprint(\u0026#39;in a.py, after import b\u0026#39;)result = b.outcome + 100print(result)
第二个文件:# b.pyprint(\u0026#39;in b.py, before import a\u0026#39;)import aprint(\u0026#39;in b.py, after import a\u0026#39;)outcome = a.arg + 1
运行a.py会得到如下输出信息:in a.py, before import bin b.py, before import ain a.py, before import bin a.py, after import bTraceback (most recent call last): File "C:\\...\\a.py", line 4, in \u0026lt;module\u0026gt;import b File "C:\\...\\b.py", line 4, in \u0026lt;module\u0026gt;import a File "C:\\...\\a.py", line 6, in \u0026lt;module\u0026gt;result = b.outcome + 100AttributeError: module \u0026#39;b\u0026#39; has no attribute \u0026#39;outcome\u0026#39;
过程用自然语言描述就是:1. 文件a.py执行到 import b 这一行的时候,开始load b.py并执行其中的statement;2. 在b.py中执行到 import a 这一行的时候,开始load a.py并开始执行其中的statement;3. 在a.py中执行到 import b 这一行的时候,发现b已经在1.中载入了,于是不再进行重复工作,开始执行下一行(于是看到“in a.py, after import b”);4. 在a.py中执行到 result = b.outcome + 100 这一步的时候,即调用模块b中的name,这个name即outcome;5. 发现b中还没有outcome这个name,报错;
看到这里应该问题的所在就清楚了,就是其实在b.py中,import a 这一行以下的代码还没有执行过,所以outcome这个name还不存在。这时候在a.py中想要qualify这个name自然会报错。
知道了这一点之后,尝试对b.py的代码做一点微小的工作,看看会怎样:# recur2.pyoutcome = 10print(\u0026#39;in b.py, before import a\u0026#39;)import aprint(\u0026#39;in b.py, after import a\u0026#39;)outcome = a.arg + 1
即在import之前先创建outcome这个name。再运行a.py结果如下:in a.py, before import bin b.py, before import ain a.py, before import bin a.py, after import b110in b.py, after import ain a.py, after import b102
让我再来用自然语言赘述一下这个过程:前4步跟之前一样;5. 在a.py中,发现b中已经存在outcome这个name了(在1.中创建),于是计算出result的结果,并且print出来这个结果;6. 对于b.py来说,import a并且执行完了a中的所有statement,于是开始继续执行b.py中余下的代码(于是看到“in b.py, after import a”);7. 在b.py中,执行到 outcome = a.arg + 1时,调用a中的名为arg的name,发现a中存在arg,于是在执行完毕这行之后,更新了b中outcome的值;8. 至此b这个被a import的模块中的代码全部执行完毕,退回到a.py中,继续执行import b之后的代码;9. 在a.py中,执行result = b.outcome + 100, 此时b.outcome已经被更新为a.arg + 1了,即2;10. 在a.py中,执行print(result),即102. 此时已经退出了所有import层,于是程序结束。
推荐阅读
- 北京22家市属医院均开展安检基本实现重点区域安检措施全覆盖
- 长江流域渔民退捕“上岸”实现扩产新致富
- 实现“甜蜜计划”,这对中哈跨国夫妻好甜
- 北京地铁11号线西段三座车站提前实现主体结构封顶
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 青年|一汽奔腾T77怎么样?车主吐槽:后排座椅太短,和坐小板凳似的
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- 电商网站支付流程的流失率是怎么样的从用户点击充值/支付按钮,到支付完成,其中每一步的流失比率都是咋样的