Вам следует рассмотреть возможность импортировать код вне функции, если импортируемый код может быть использован более одного раза, и изнутри функции, если вы знаете, что использование кода будет ограничено. Некоторые люди предпочитают размещать все операторы import в верхней части файла, чтобы явно обозначить все зависимости их кода. Оба варианта работают.
Импортируем модуль с другим именем
В нашей основной программе weatherman.py мы делали вызов import report. Но что, если у вас есть другой модуль с таким же именем или вы хотите использовать более короткое или простое имя? В такой ситуации можете выполнить импорт с помощью
import report as wr
description = wr.get_description()
print("Today's weather: ", description)
Импортируем только самое необходимое
С помощью Python вы можете импортировать одну или несколько частей модуля. Каждая часть может сохранить свое оригинальное имя, или же вы можете дать ей alias. Для начала импортируем функцию get_description() из модуля report с помощью его оригинального имени:
from report import get_description
description = get_description()
print("Today's weather: ", description)
Теперь импортируем ее как do_it:
from report import get_description as do_it
description = do_it()
print("Today's weather: ", description)
Каталоги поиска модулей
Где Python ищет файлы для импорта? Он использует список имен каталогов и ZIP-архив, хранящийся в стандартном модуле sys, как переменную path. Вы можете получить доступ к этому списку и изменить его. Вот так выглядит значение переменной sys.path в Python 3.3 в моей версии операционной системы Mac:
>>> import sys
>>> for place in sys.path:
…·····print(place)
…
/Library/Frameworks/Python.framework/Versions/3.3/lib/python33.zip
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/plat-darwin
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/lib-dynload
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages
Пустое место в начале вывода содержит в себе строку '', которая символизирует текущий каталог. Если строка '' находится первой в sys.path, Python сначала выполнит поиск в текущем каталоге, когда вы попробуете что-то импортировать: import report выглядит как report.py.
Будет использован первый найденный модуль. Это означает, что, если вы определите модуль с именем random и он будет найден раньше оригинального модуля, вы не получите доступ к стандартной библиотеке random.
Пакеты
Мы перешли от отдельных строк кода к функциям, отдельным программам и модулям, располагающимся в одной папке. Чтобы сделать еще один шаг, вы можете организовать модули в иерархии файлов, которые называются
Возможно, нам нужны разные типы прогнозов погоды: на следующий день и следующую неделю. В качестве одного из вариантов мы можем создать папку с именем sources, а внутри нее — два модуля: daily.py и weekly.py. Каждый из них содержит функцию forecast. Версия на каждый день возвращает строку, а версия на каждую неделю — список из семи строк.
Рассмотрим основную программу и два модуля. (Функция enumerate() разбивает список на части и отправляет каждый элемент списка в цикл for, добавляя к каждому элементу число в качестве небольшого бонуса.)
Основная программа — boxes/weather.py:
from sources import daily, weekly
print("Daily forecast: ", daily.forecast())
print("Weekly forecast: ")
for number, outlook in enumerate(weekly.forecast(), 1):
····print(number, outlook)
Модуль 1: boxes/sources/daily.py.
def forecast():
····'fake daily forecast'
····return 'like yesterday'
Модуль 2: boxes/sources/weekly.py.
def forecast():
····"""Fake weekly forecast"""
····return ['snow', 'more snow', 'sleet',