Nie jestem pewien, skąd wzięło się takie prze­świad­cze­nie, ale ostat­nio kilka osób pró­bo­wało mnie prze­ko­nać, że w Pytho­nie nie da się wyko­nać dwu­kie­run­ko­wego importu.

Roz­ważmy naiwny przy­kład pro­gramu ładu­ją­cego wtyczkę, która z kolei chce korzy­stać z API swo­jego hosta. Zga­dzam się, że takie dwu­kie­run­kowe zależ­no­ści to na ogół oznaka bar­dzo złego desi­gnu, są jed­nak sytu­acje, w któ­rych ciężko ich uniknąć.

Pozo­staje pro­blem imple­men­ta­cji. Oka­zuje się, że zwo­len­nicy teo­rii nie da się dzielą się na tych, któ­rzy nigdy nie pró­bo­wali, ale ktoś coś wspo­mi­nał oraz na tych, któ­rzy ocze­ki­wali od Pythona zdol­no­ści myśle­nia. Dwu­kie­run­kowy import na pozio­mie glo­bal­nym modu­łów nie wymaga spe­cjal­nych zabie­gów, trzeba być jed­nak przy­go­to­wa­nym na dwa ograniczenia:

  • Impor­to­wać można tylko wstecz, a więc wyłącz­nie sym­bole zde­fi­nio­wane przed impor­tem, który dopro­wa­dził do powsta­nia pętli (co jest dość logiczne, gdyż w pozo­sta­łych przy­pad­kach mamy do czy­nie­nia z pro­ble­mem jajka i kury)
  • W pew­nych oko­licz­no­ściach kod zosta­nie wyko­nany dwukrotnie

Dzia­ła­jącą pętlę impor­tów poka­zuje poniż­szy przykład:

Uwaga: na dia­gra­mie jest lite­rówka, oczy­wi­ście moduł bar powi­nien impor­to­wać sym­bol a zamiast b.

Circular dependencies in Python