Nie jestem pewien, skąd wzięło się takie przeświadczenie, ale ostatnio kilka osób próbowało mnie przekonać, że w Pythonie nie da się wykonać dwukierunkowego importu.

Rozważmy naiwny przykład programu ładującego wtyczkę, która z kolei chce korzystać z API swojego hosta. Zgadzam się, że takie dwukierunkowe zależności to na ogół oznaka bardzo złego designu, są jednak sytuacje, w których ciężko ich uniknąć.

Pozostaje problem implementacji. Okazuje się, że zwolennicy teorii nie da się dzielą się na tych, którzy nigdy nie próbowali, ale ktoś coś wspominał oraz na tych, którzy oczekiwali od Pythona zdolności myślenia. Dwukierunkowy import na poziomie globalnym modułów nie wymaga specjalnych zabiegów, trzeba być jednak przygotowanym na dwa ograniczenia:

  • Importować można tylko wstecz, a więc wyłącznie symbole zdefiniowane przed importem, który doprowadził do powstania pętli (co jest dość logiczne, gdyż w pozostałych przypadkach mamy do czynienia z problemem jajka i kury)
  • W pewnych okolicznościach kod zostanie wykonany dwukrotnie

Działającą pętlę importów pokazuje poniższy przykład:

Uwaga: na diagramie jest literówka, oczywiście moduł bar powinien importować symbol a zamiast b.

Circular dependencies in Python