Когда модуль загружается в первый раз, все строки в нем запускаются.import
s, def
s, обычные назначения и т. Д. Все эти строки инициализируют пространство имен, являющееся объектом модуля.Пространство имен foo
будет иметь переменную np
, которая указывает на загруженный модуль numpy, и переменную fun
, которая указывает на ваш объект функции.
Функции являются объектами первого класса в python.В частности, они имеют атрибут __globals__
(см. «Типы, которые можно вызвать» в связанных документах), который указывает на пространство имен модуля, в котором они были определены. Независимо от того, что вы делаете со ссылкойиз foo.fun
, имя np
будет доступно в функции, пока вы не удалите его из самого foo
.
Не рекомендуется импортировать что-либо внутри своей функции, если только у вас нет веской причинысделай так, как избегая глобального имени.Когда вы import
модуль, интерпретатор сначала смотрит на sys.modules
.Если он найден, import
не займет много времени, чем поиск в глобальном словаре.Однако, если модуль еще не загружен, он будет тут же.Возможно, вы не захотите брать на себя эти накладные расходы в произвольной точке вашей программы, особенно в той, которая может быть чувствительной ко времени.
Что касается формы импорта, различия в основном эстетичны, но они имеют практические последствия, посколькуЧто ж.from foo import fun
создает имя fun
в вашем пространстве имен, ссылаясь непосредственно на интересующий функциональный объект.Он загрязняет ваше локальное пространство имен дополнительным именем, но при каждом доступе к функции сохраняет поиск в словаре пространства имен foo
.import foo
, с другой стороны, сохраняет все в порядке, так как вам нужно позвонить foo.fun
, но это требует дополнительного поиска.
TL; DR
Вы должны поместить все ваши импорта в верхней части вашего файла.Неважно, как ты это делаешь.