Как-то не очень представляю себе как циклические импорты при разбивке здорового человека могут быть. Есть у тебя Foo и Bar в двух модулях. В Foo лежит одноименный тип и мешок каких-нибудь функций для работы с ним. Bar использует и импортит Foo. Чтоб получился циклический импорт - нужно в Foo начать использовать Bar, т.е. заиметь либо функцию, которая одновременно и Foo и Bar использует, либо еще какую-то функцию, которая просто использует Bar.
Во втором случае очевидно, что эта функция должна лежать в модуле Bar, в первом она либо должна лежать в Bar, либо в третьем модуле, который будет зависеть от Foo и Bar 🤔
есть модуль А с типом А.
есть функция преобразования А в форму Б, которая совсем сбоку и не является частью А. положим в модуль Б, который зависит от А.
есть сторонний тайпкласс В, надо реализовать инстанс В А. где? конечно, в модуле А, больше негде. но для реализации надо использовать преобразование А в Б, так возникает зависимость от Б.