Python __init__: циклический импорт (снова)

Я хотел бы отделить некоторый абстрактный код от его реализации и связать фактическую реализацию как импорт в __init__.py.

Мой 'model/__init__.py' выглядит так:

from .estimator import AbstractEstimator
# link default estimator implementation
from impl.tf import TF_Estimator as Estimator

Однако TF_Estimator является подклассом 'model.AbstractEstimator':

from model import AbstractEstimator
class TF_Estimator(AbstractEstimator):
    ...

Как я могу разрешить эту циклическую зависимость? Есть ли способ "игнорировать" импорт 'TF_Estimator' в 'model/__init__.py'?

Моей целью было бы запустить "from model import Estimator" и получить "TF_Estimator" обратно в конце.


person Hoeze    schedule 09.03.2018    source источник
comment
Кажется, некоторое время назад я задавал себе аналогичный вопрос. Моя касалась исключений, но основная проблема заключалась в том, чтобы структурировать пакет, чтобы избежать циклического импорта. Это может помочь? stackoverflow.com/ questions / 48104895 /   -  person Olivier Melançon    schedule 09.03.2018
comment
model.AbstractEstimator - это просто еще одно название для .estimator.AbstractEstimator. Почему вы не можете использовать это вместо этого? Пространство имен model следует рассматривать как открытый интерфейс; это не обязательно должно использоваться вашей реализацией.   -  person chepner    schedule 09.03.2018
comment
@chepner: Боже мой, я не видел этого очевидного решения ... Спасибо!   -  person Hoeze    schedule 09.03.2018
comment
@Olivier: Спасибо за указатель. Я буду иметь это в виду как более общее решение.   -  person Hoeze    schedule 09.03.2018


Ответы (1)


Решение было довольно простым благодаря @chepner: просто используйте from model.estimator import AbstractEstimator в TF_Estimator; Это пропускает загрузку 'model/__init__.py'

person Hoeze    schedule 09.03.2018