В предыдущем уроке мы рассмотрели два вида импорта в языке Python: можно импортировать модуль целиком или отдельные его определения. Здесь мы продолжим знакомиться с модулями, но для начала обсудим терминологию. Во время импорта всего модуля можно обращаться к нему «через точку». Вспомним, как выглядит такая запись: module.name
.
Для такой формы записи существует и более официальный термин — квалифицированное имя. Соответственно, импорт модуля целиком из прошлого урока официально называется квалифицированным импортом.
Стоит отметить, что в Python все строчки с import
принято располагать в самом начале кода модуля. Такой набор строчек часто называют блоком импортов, хотя синтаксически этот блок никак не выделен — это обычные строчки одна за другой. Эта группировка повышает читаемость кода: так разработчикам проще искать ошибки в коде и исправлять их.
Импорт всего содержимого модуля
Рассмотрим третий вариант — импорт всего содержимого модуля. Так он выглядит в коде:
from some_module import *
from another_module import *
Здесь из модулей some_module
и another_module
неявно импортируются все определения. Такой способ импорта дает доступ к десяткам переменных, констант и функций, причем можно не указывать названия содержимого из всего модуля. Эта особенность отличает импорт содержимого от импорта модуля целиком — и она же может усложнять чтение кода.
Посмотрим на примере. Представим программиста, который читает чужой код с импортом содержимого. В какой-то момент он встречает название незнакомой переменной и хочет узнать, откуда она взялась. Недостаточно просто внимательно посмотреть на блок импортов или сделать поиск по коду — названия всех импортированных определений скрываются за *
.
Именно поэтому в большинстве руководств по написанию кода на Python повторяется один и тот же совет: «Как можно реже пользуйтесь импортом всего содержимого». Тем не менее в реальном коде такие импорты встречаются, поэтому было важно упомянуть этот вариант.
Сочетание способов импорта
В предыдущем уроке говорилось об импорте модуля целиком и импорте отдельных определений. Чтобы углубить знания, рассмотрим еще один способ — сочетание импорта целиком и отдельными определениями в рамках одного и того же модуля.
Рассмотрим пример. В модуле computation.py
определим функцию и переменные:
PI = 3.1415926
E = 2.7182818
def pi_times(x: float) -> float:
return x * PI
А в модуле main.py
воспользуемся двумя способами импорта из модуля computation.py
:
# file: main.py
import computation
from computation import PI, E
from computation import pi_times
print(PI)
print(computation.E)
print(pi_times(2))
print(computation.pi_times(E))
Из примеров выше видно, что можно:
- Использовать оба способа импорта одновременно
- Импортировать отдельные определения в несколько заходов
- Получать доступ «через точку» к определениям, которые уже импортированы по имени