Я давно разработчик python. Я пробовал Go, конвертируя существующее приложение python в Go. Он модульный и отлично работает для меня.Циклические зависимости и интерфейсы в Golang
При создании той же структуры в Go я, кажется, попал в циклические ошибки импорта, намного больше, чем я хочу. Никогда не было проблем с импортом в python. Мне даже не пришлось использовать импортные псевдонимы. Поэтому у меня, возможно, был некоторый циклический импорт, который не был очевидным в питоне. Я действительно нахожу это странным.
В любом случае, я потерян, пытаясь исправить их в Го. Я прочитал, что интерфейсы могут использоваться, чтобы избежать циклических зависимостей. Но я не понимаю, как это сделать. Я тоже не нашел примеров. Может ли кто-нибудь помочь мне в этом?
Текущая структура приложения питон выглядит следующим образом:
/main.py
/settings/routes.py contains main routes depends on app1/routes.py, app2/routes.py etc
/settings/database.py function like connect() which opens db session
/settings/constants.py general constants
/apps/app1/views.py url handler functions
/apps/app1/models.py app specific database functions depends on settings/database.py
/apps/app1/routes.py app specific routes
/apps/app2/views.py url handler functions
/apps/app2/models.py app specific database functions depends on settings/database.py
/apps/app2/routes.py app specific routes
settings/database.py
имеет общие функции, такие как connect()
, который открывает сеанс дб. Таким образом, приложение в пакете приложений вызывает database.connect()
и открывается сеанс db.
То же самое имеет место с settings/routes.py
, он имеет функции, позволяющие приложениям добавлять свои подпункты к основному объекту маршрута.
Пакет настроек больше о функциях, чем данных/константах. Это код, который используется приложениями в пакете приложений, которые в противном случае должны были бы дублироваться во всех приложениях. Так что, если мне нужно изменить класс маршрутизатора, например, мне просто нужно изменить settings/router.py
, и приложения будут продолжать работать без каких-либо изменений.
Должен показать код, лучше всего подрезать версию, которая показывает проблему. Может быть, вы просто разбиваете свой код на слишком много небольших пакетов? – Volker
Если пакет X принимает/сохраняет/вызывает методы в/возвращает типы, определенные в пакете Y, но фактически не имеет прямого доступа к функциям или переменным Y (не-метод), X может использовать интерфейс, который соответствует типу в Y, а не фактическому импорту Y. Именно так интерфейсы могут помочь сократить зависимости (циклические и другие) в двух словах. – twotwotwo
В Python, если X и Y импортируют друг друга, все, что происходит, является одним из модулей, загружаемым, в то время как другой модуль по-прежнему пуст или имеет половину разбора - и поскольку поиск имени Python в функциях и т. Д. Возникает только тогда, когда функция вызванный, пустой модуль во время разбора из-за циклического импорта часто не является проблемой. Согласитесь с тем, что Volker нам нужен код, чтобы помочь больше - вам, возможно, потребуется объединить вещи, разделить вещи, мы никак не можем сказать. – twotwotwo