Делаются ли пакеты в верхней части модуля импортированными, когда мы вызываем только функцию из этого модуля - PullRequest
1 голос
/ 17 июня 2019

У меня есть модуль foo.py, который я импортирую в мой файл main.py, у меня imports вверху foo.py, например import numpy as np и т. Д. Теперь, если я вызываю только определенную функцию fun(arg1, arg2, arg3), происходит ли imports в верхней части foo.py или мне нужно добавить imports в определение функции fun?

Кроме того, from foo import fun имеет значение тогда import foo в этом отношении?

Файл foo.py (будет импортирован)

import numpy as np

def fun(arg1, arg2, arg3):
    x = np.argsort(arg1)
    return x

Файл main.py

import foo

call = fun([2, 34, 0, -1], 4, 5])

Или я должен пойти с этим в foo.py?

def fun(arg1, arg2, arg3):
   import numpy as np
   x = np.argsort(arg1)
   return x

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Нет, вам не нужно импортировать его снова внутри fun.Вы можете проверить это, ваш код должен работать, даже если ваш импорт numpy только один раз на вершине foo.py.

Два способа не имеют никакого значения, за исключением того, что если вы импортируете как import foo Вы должны ссылаться на fun как foo.fun.Если вы вместо этого сделаете from foo import fun, вы можете просто использовать fun.

. При импорте модуля python выполнит все операторы в файле модуля.Таким образом, когда вы импортируете foo любым из вышеперечисленных способов, он запустит import numpy as np и обновит таблицу личных символов для foo.Все операторы, функции, определенные внутри foo, могут использовать символы в этой таблице без какой-либо квалификации.В вашем случае fun будет иметь доступ к numpy как np.

Что происходит с numpy, сам импорт более интересен.

Случай 1

from foo import fun

Вы импортируете только fun больше ничего.Какой бы код в fun не выполнялся по вышеуказанным причинам, но сам np будет невидим для кода в main.

Случай 2

import foo

Здесь вы будете ссылаться на fun как foo.fun, как я уже говорил, но np также может использоваться как foo.np, но это абсолютно не рекомендуется.

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

Прочтите о системе импорта , чтобы полностью понять все это.

1 голос
/ 17 июня 2019

Когда модуль загружается в первый раз, все строки в нем запускаются.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

Вы должны поместить все ваши импорта в верхней части вашего файла.Неважно, как ты это делаешь.

0 голосов
/ 17 июня 2019

Не нужно импортировать его снова внутри функции fun ().

Для получения дополнительной информации, пожалуйста, отметьте это Что является лучшей практикой - глобальный импорт или локальный импорт

...