Каждый модуль X должен импортировать все (и только) модули Y, Z, T, ..., функциональность которых ему требуется, не беспокоясь о том, что могут иметь другие модули Fee, Fie, Foo ... (если таковые имеются) уже выполнили часть или весь этот импорт или могут сделать это в будущем.
Это сделало бы модуль чрезвычайно хрупким (в действительности, это было бы полной противоположностью модульности !), Если бы каждому модулю приходилось беспокоиться о таких тонких эффектах "скрытого канала".
То, что другие модули Y, Z, T, ..., каждый модуль X выбирает для импорта (если есть), является частью деталей реализации X и не должно касаться никого, кроме разработчиков, которые кодируют, тестируют или поддерживают X.
Чтобы убедиться, что это так, и что за этой явно лучшей стратегией развязки может и будет полностью следовать здравый код, Python «кэширует» модули по мере их импорта: модуль «загружается» только один раз при каждом запуске программы, когда кто-то импортирует ее в первый раз (или что-либо из нее) - во всех остальных операциях импорта используется тот же объект, полученный при первой загрузке, который Python хранит в кеше (который указан как dict sys.modules
, но вам нужно знать эту деталь только для несколько продвинутых методов программирования ... не беспокойтесь об этом, 98,7% времени - просто помните, что "импорт дешев"! -).
Конечно, conf.py
, который вы используете из нескольких других модулей через import conf
, определенно является модулем (вы можете подумать, что загружаете его несколько раз, но это не так, если вы не используете довольно продвинутый и преднамеренный техника действительно для этой цели) - почему бы и не быть?