Питонический способ использования islice
в script2
- это
from itertools import islice
Механизм импорта в Python довольно умный.Импорт модуля не загружает модуль автоматически каждый раз.Первый шаг - всегда проверять, находится ли модуль в sys.modules
.Если это так (как это было бы в вашем случае), соответствующие существующие ссылки привязаны к именам в вашем пространстве имен.
Давайте рассмотрим конкретный пример с двумя модулями ниже:
mod1.py
from itertools import izip_longest, islice
from mod2 import some_function
# code that uses islice and some_function
mod2.py
from itertools import islice
def some_function():
# do the thing
Если вы запустите mod1
,произойдет следующая (отредактированная) последовательность событий:
- Создайте пустой объект модуля и зарегистрируйте / кэшируйте его в
sys.modules['mod1']
или sys.modules['__main__']
, в зависимости от того, как вы запустите скрипт. - Начните выполнение кода в
mod1.py
. - Проверьте, есть ли
itertools
в sys.modules
: это не - Сделайте некоторую магию, чтобы найти, зарегистрировать и загрузить
itertools
в sys.modules['itertools']
- Добавьте атрибуты
izip_longest
и islice
в ваше глобальное пространство имен в неполном mod1
- Проверьте, находится ли
mod2
в sys.modules
: это не - Сделайте немного магии, чтобы найти
mod2
и создайте пустой sys.modules['mod2']
- Начните выполнение кода в
mod2.py
. - Проверьте, если
itertools
находится в sys.modules
: это - Добавьте атрибут
islice
в ваше глобальное пространство имен в неполном mod2
.Это в основном эквивалентно выполнению islice = sys.modules['itertools'].islice
на данный момент.Здесь ничего не загружается. - Выполните оператор
def
, чтобы создать объект функции, и добавьте его в глобальное пространство имен mod2
с именем some_func
. mod2
isтеперь полностью загружен
- Выполните оставшийся код в
mod1
Так что, как вы можете видеть, вы можете сказать, что модуль itertools
техническиимпортируется дважды, загружается только один раз.Во второй раз имя islice
привязано к локальному имени.
Официальную документацию о всей процедуре можно прочитать здесь: https://docs.python.org/2/reference/simple_stmts.html#the-import-statement. Эта последовательность событий была в одном месте.реализация или другая, начиная с версии 2.0: https://docs.python.org/2.0/ref/import.html. Вы также можете прочитать больше о том, как модули работают в целом, здесь: https://docs.python.org/2/tutorial/modules.html. Как правило, я нашел официальные документылучший учитель Python за пределами, возможно, переполнение стека.
Еще одна вещь, которую нужно помнить, это то, что модули не разделяют пространства имен.Глобальные переменные внутри модуля - это просто атрибуты этого конкретного объекта модуля.Тем не менее, вы можете сделать что-то вроде этого:
mod2.py
from itertools import islice
def some_function(): pass
mod1.py
import mod2
#use mod2.some_function and mod2.islice as attributes of mod2
Таким образом, у вас есть только один явный импорт islice
.Я не считаю это очень питонным подходом.Один из ключевых принципов Python - «явное лучше, чем неявное», и удобочитаемость важнее краткости.Когда вы используете mod2.islice
, для читателя подразумевается, что mod2
определяет версию функции, которая отличается от встроенной.
В качестве отступления, рассмотрите возможность перехода на Python 3.6+ в ближайшее время.,Есть много улучшений и новых функций.Python 2.x не будет поддерживаться намного дольше, и многие популярные сторонние библиотеки, такие как numpy, полностью прекратят поддержку Python 2 в следующих выпусках.