Как правильно импортировать модули, которые используются как в основном коде, так и в модуле? - PullRequest
2 голосов
/ 21 марта 2010

Предположим, у меня есть главный скрипт main.py, который импортирует другой файл python с import coolfunctions и еще один: import chores

Теперь, предположим, что coolfunctions также использует вещи из рутинной работы, поэтому я объявляю import chores внутри coolfunctions.

Поскольку операции импорта как main.py, так и coolfunctions ~ избыточны? Есть ли другой способ сделать это? Я делаю это правильно?

Я не совсем понимаю, как вообще следует структурировать проекты на Python. У меня есть файл "conf.py", который я импортирую для нескольких переменных ~ это модуль или нет? Я загружаю этот файл conf также в нескольких местах.

Ответы [ 4 ]

2 голосов
/ 21 марта 2010

Если два модуля хотят использовать chores, то каждый должен import chores (или некоторый эквивалентный импорт). Каждый импорт создает привязку имени только в пространстве имен модуля, который выполняет импорт; то есть import эффект пространства имен локальный по отношению к пространству имен модуля .

Это хорошо, потому что, глядя на код модуля, вы можете (за исключением патологических случаев) узнать , где каждое имя связано с с помощью операторов импорта, которые явно связывают модули или атрибуты модуля с именами. Импорт, выполненный в других модулях, не повлияет на пространство имен этого модуля.

1 голос
/ 21 марта 2010

Каждый модуль X должен импортировать все (и только) модули Y, Z, T, ..., функциональность которых ему требуется, не беспокоясь о том, что могут иметь другие модули Fee, Fie, Foo ... (если таковые имеются) уже выполнили часть или весь этот импорт или могут сделать это в будущем.

Это сделало бы модуль чрезвычайно хрупким (в действительности, это было бы полной противоположностью модульности !), Если бы каждому модулю приходилось беспокоиться о таких тонких эффектах "скрытого канала".

То, что другие модули Y, Z, T, ..., каждый модуль X выбирает для импорта (если есть), является частью деталей реализации X и не должно касаться никого, кроме разработчиков, которые кодируют, тестируют или поддерживают X.

Чтобы убедиться, что это так, и что за этой явно лучшей стратегией развязки может и будет полностью следовать здравый код, Python «кэширует» модули по мере их импорта: модуль «загружается» только один раз при каждом запуске программы, когда кто-то импортирует ее в первый раз (или что-либо из нее) - во всех остальных операциях импорта используется тот же объект, полученный при первой загрузке, который Python хранит в кеше (который указан как dict sys.modules, но вам нужно знать эту деталь только для несколько продвинутых методов программирования ... не беспокойтесь об этом, 98,7% времени - просто помните, что "импорт дешев"! -).

Конечно, conf.py, который вы используете из нескольких других модулей через import conf, определенно является модулем (вы можете подумать, что загружаете его несколько раз, но это не так, если вы не используете довольно продвинутый и преднамеренный техника действительно для этой цели) - почему бы и не быть?

1 голос
/ 21 марта 2010

Нет, это не избыточно - это нормально до import chores как в основном модуле, так и в coolfunctions.

Точная механика импорта Python сложна (например, импорт модуля выполняется толькоодин раз, это означает, что в вашем случае фактический разбор и загрузка модуля chores произойдет только один раз, что является хорошей оптимизацией), но в целом вам не следует об этом беспокоиться, потому что он просто работает .

Каждый файл Python является модулем, поэтому ваш conf.py также является модулем.

0 голосов
/ 21 марта 2010

Всегда рекомендуется импортировать все необходимые модули в файл, который их использует. Возьмем для примера:

A.py содержит: import coolfunctions

B.py содержит: import A

Main.py содержит: import B и использует функции, определенные в A.py (это возможно, потому что, импортируя B, Main.py импортировал все, что импортирует B)

Если в будущем вы измените B.py на функцию без необходимости импортировать A.py и, следовательно, удалите import A, то ваш Main.py понесет потерю отсутствия импортированного A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...