Невозможно импортировать класс в пакете - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующая структура проекта: 1

а вот содержимое файлов:

# run.py
from module.submodule.base import DefaultObject

d = DefaultObject()


# module/sumbodule/base.py
from module.submodule.modulea import A

class BaseObject(object):
    pass

class DefaultObject(BaseObject):

    def return_something(self):
        return A()


# module/submodule/modulea.py
from module.submodule.moduleb import B

class A(object):

    def return_something(self):
        return B()


# module/submodule/moduleb.py
from module.submodule.base import BaseObject

class B(BaseObject):
    pass

и когда я пытаюсь запустить python3 run.py, я получаю ImportError: cannot import name 'BaseObject

Я не понимаю, почему я могу импортировать class B в modulea.py, но я не могу class BaseObject в moduleb.py

Как правильно делать импорт в такой ситуации?

1 Ответ

0 голосов
/ 26 июня 2018

У вас есть круговой импорт - модуль импорта базы, который импортирует модуль, который импортирует базу. Python не поддерживает циклический импорт, поэтому он не может работать технически, и даже для языков, которые его технически поддерживают, циклические зависимости в любом случае очень плохи.

Ваши решения здесь - перегруппировать взаимозависимые объекты (классы, функции и т. Д.) В одном модуле - обратите внимание, что Python не является Java и не требует «одного модуля на класс» (на самом деле это даже антипаттерн в Python) - или переместить DefaultObject в собственный модуль.

...