假设我有一个非常长的脚本。(在我的情况下,长达1000多行)所以我把它分成了一些文件:
main.py #the file i execute
foo1.py #a file my main.py imports
foo2.py #a file imported by foo1.py
(注意:main.py导入多个文件,而不仅仅是一个) Foo1.py拥有Tkinter以及与之相关的东西,而Foo2.py拥有一个巨大的对象类,其中包含与所述类相关的函数。
我的问题如下:
而且我也无法将该函数导入Foo2,因为Foo1已经拥有它并且会引发导入错误。
答案 0 :(得分:1)
当两个模块相互导入时,您需要记住一些事项,以便在需要之前定义所有内容。
首先考虑导入机制:
sys.modules
并且定义文件开始执行(暂停执行导入程序)sys.modules
中的条目 - 文件是否已完成执行 那么先说加载模块A
,导入模块B
然后导入模块A
,当发生这种情况时执行如下:
A
首次从其他地方导入,A
已添加到sys.modules
A
以导入B
B
已添加到sys.modules
B
:
A
时,部分加载的模块来自sys.modules
B
在恢复之前完全运行A
继续执行,可以访问完整模块B
* 1所以from A import x
只有在x
A
之前import B
定义import A
时才有效,只需使用def
即可获得模块对象在文件执行时更新,因此虽然在导入后它可能没有所有定义,但是当文件有机会完成执行时。
所以解决这个问题的最简单方法是首先不要依赖导入来执行模块 - 这意味着循环导入的所有用法都在var obj = new Derived { Licensed = () => true; };
obj.Enabled = () => obj.Licensed() && true;
块内,而不是从模块级别调用执行。