如何解决无限循环导入?

时间:2020-02-03 00:53:23

标签: python class import module

我想了解问题的根源。我已经遇到过几次了,每次弄清楚都是很耗时的。

这一次,我感觉好像错过了一些我认为自己理解的东西。 一个相关的问题发布在这里:Infinite loop with Python imports; looking for Pythonic way

我确定我的模块存在无限循环,但仍然出现相同的错误。所以这就是我所拥有的。 我也在此处包括//I Want to get 2 values through Url. n1 and n2 and pass to getsheetvalues. function doGet(e) { var sheet = SpreadsheetApp.openById('Google Secret key').getSheetByName('Google'); var b1 = sheet.getSheetValues(e.parameters.n1, 23, 1 , e.parameters.n2); return ContentService.createTextOutput(b1); ) 个文件,因为我怀疑该文件可能会导致我目前不知道的行为。

__init__.py中:

sources/preparation/features/__Init__.py

from .build_features import * from .get_qualified_edges import * from .select_strategy import * from .test import * 中,我有:

sources/preprocessing/__init__.py

from .apply_preprocessing import * from .convertion import * 中,我有:

sources/preprocessing/apply_preprocessing

在目录from Sources.Preparation.Features.get_qualified_edges import get_all_GeneDisease_unweighted_disease2disease_qualified_edges from Sources.Preparation.Features.get_qualified_edges import get_GPSim_disease2disease_qualified_edgesjk 中:

source/preparation/features/get_qualified_edges.py

from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised from itertools import combinations 中,我没有任何导入。

以下是由于出现错误而运行的文件的顺序:

Sources/preprocessing/conversion.py

当我从sources\__init__.py sources\preparation\__init__.py sources\prepartion\features\__init__.py sources\preparation\features\build_features.py sources\preparation\features\get_qualified_edgdes.py sources\preprocessing\__init__.py sources\preprocessing\apply_preprocessing.py \\error raise 导入一个类时,将引发错误,如下所示。在Sources.Preprocessing.convertion中:

source/preparation/features/get_qualified_edges.py

让我知道您是否需要有关此问题的更多信息。

我想知道的是:为什么会出现此问题? 当我将from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised Converter移到Sources.Preprocessing.convertion时,我解决了这个问题。

观察

我观察到的是,当Sources.Preparation.Data.conversion(导入Sources.Preprocessing.modules_A)和Sources.Preparation.modules_C(导入Sources.Preparation.modules_B)之间没有“交叉”导入时,错误消失了。

就是这样。在各个模块之间没有直接的“交叉”导入,而在父模块之间没有“交叉”导入。

1 个答案:

答案 0 :(得分:1)

问题在于您正在从文件中引入循环导入。

对于sources/preprocessing中的文件,您正在从source/preparation导入内容。但是这些文件又从source/preprocessing导入内容。

一旦您拥有类似

的导入链

A.py-> B.py-> C.py-> B.py -> E.py

(直接循环)

A.py-> B.py-> C.py-> D.py-> B.py -> E.py

(间接循环)

然后它将无法继续导入模块,因为它不可能终止。

在python中克服此问题的一种简单方法是使用本地导入。

例如,代替

from Sources.Preprocessing.convertion import Converter 
# more code.....

class A:

  def foo():
    bar = Converter()

您可以改为使用本地导入

# more code.....

class A:

  def foo():
    from Sources.Preprocessing.convertion import Converter 

    bar = Converter()

,使得它仅在实际使用对象之前导入。这样可以避免一开始就导入所有内容,从而避免了循环导入。


编辑:

简而言之,要回答OP关于这个特定问题的问题:

您在代码中的某处启动了预处理模块的导入。 (可能在sources\preparation\features\get_qualified_edgdes.py中?不太确定) 目前,预处理已添加到sys.modules命名空间,但作为一个空模块(占位符)。

稍后在同一导入链中的文件source/preparation/features/get_qualified_edges.py中的行

from Sources.Preprocessing.convertion import Converter

尝试从 Preprocessing 模块导入convertion,但是它会找到一个空模块(因为它仍在导入过程中),因此无法找到相应的名称({ {1}})。