Python, "wzajemne" importowanie modułów

Mam następującą strukturę katalogów:

(główny)
|----A
|    |---- __init__.py
|    |---- B.py
|    |---- C.py
|
|----main.py

W main.py:

from A.B import BClass
b = BClass()

W B.py:

from C import CClass
class BClass: pass
c = CClass()

W C.py:

from B import BClass
class CClass: pass

Powyższy kod (uruchomienie main.py) wyrzuca błąd :

A\C.py, line 1, in <module>
from B import BClass
ImportError: cannot import name BClass

Nie rozumiem co robię źle. Błąd znika dopiero po zakomentowaniu pierwszej linii z C.py . Czy moduły nie mogą się wzajemnie importować? Jak powinna wyglądać prawidłowa zależność między modułami?

  • Wykonanie twojego programu "krok po kroku":

    1. Wykonaj moduł "main"
    2. Importuj nazwę "BClass" z modułu "A.B"
    3. Importuj nazwę "CClass" z modułu C
    4. Importuj nazwę "BClass" z modułu B. Moduł B już jest w trakcie wykonanie, więc interpreter sprawdza czy jest w nim nazwa "BClass". Nie ma, bo jeszcze wykonanie B nie doszło do stworzenia klasy. Błąd.

    Cykliczne importowanie w Pythonie, nie jest dobrym pomysłem. Musisz wziąć pod uwagę, że nie istnieje pojęcie "definicji" w tym języku. Są tylko instrukcję, które tworzą obiekty i nadają im nazwy. W szczególności, nazwy klas czy funkcji mogą być w danym module tworzone dynamicznie (np. na podstawie pliku konfiguracyjnego).

    Bardzo (bardzo!) rzadko istnieje potrzeba cyklicznego importowania. Można to rozwiązać wtedy przesuwając instrukcję "import" niżej, tak aby wystąpiła po definicji obiektów potrzebnych w importowanym module:

    # B.py
    class BClass: pass # utwórz klasę 
    from C import CClass
    c = CClass()
    
    # C.py
    from B import BClass # teraz będzie ok
    class CClass: pass
    

Zaloguj się, aby dodać swoją odpowiedź