Как решить бесконечный l oop импорт? - PullRequest
1 голос
/ 03 февраля 2020

Я хочу понять root моей проблемы. Я сталкивался с этим пару раз, и каждый раз мне приходилось разбираться с этим.

На этот раз я чувствую, что упустил что-то, что, как мне казалось, я понял. Связанный вопрос размещен здесь: Бесконечный l oop с Python импортом; ищу Pythoni c way

Я решил, что мои модули представляют бесконечный l oop, но я все еще получаю ту же ошибку. так вот что у меня есть. Я также включил сюда __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 (импортировано в Sources.Preprocessing.modules_D).

Вот и все. Нет прямого «перекрестного» импорта между модулями, и вместо этого есть «перекрестный» импорт между родительскими модулями, если это имеет смысл.

1 Ответ

1 голос
/ 03 февраля 2020

Проблема заключается в том, что вы вводите циклический c импорт из ваших файлов.

Для файлов с 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()

, так что он импортируется только до того, как вы фактически используете объект. Это позволит избежать импорта всего с самого начала, что исключает циклический c импорт.


Редактировать:

Короче говоря, чтобы ответить на вопрос ОП по этому конкретному вопросу Проблема:

Где-то в коде вы инициировали импорт модуля предварительной обработки . (вероятно, в sources\preparation\features\get_qualified_edgdes.py? не слишком уверен) В это время предварительная обработка добавляется в пространство имен sys.modules, но как пустой модуль (заполнитель).

Позже в том же цепочка импорта, в файле source/preparation/features/get_qualified_edges.py, строка

from Sources.Preprocessing.convertion import Converter

пытается импортировать convertion из модуля предварительной обработки , но обнаружит пустой модуль (так как он все еще находится в процесс импорта) и, следовательно, не удалось найти соответствующее имя (convertion в данном случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...