Урок 25 из 84 · Основы Python
Модули
Содержание урока
Программы на Python содержат тысячи, десятки тысяч и сотни тысяч строк кода (есть проекты с миллионами). В таких условиях одним файлом с кодом не обойдёшься — его нужно разбивать на части. Для получения доступа к коду, который находится в других файлах, в Python реализован механизм модулей.
Модули и импортирование
Итак, файл с кодом на Python называется модулем. Имя модуля соответствует имени файла, поэтому файлы в Python принято называть в стиле "snake_case" (отметьте иронию: Python — питон — змея — snake — snake_case). Одни модули могут использовать содержимое других, если импортируют эти другие модули с помощью инструкции import.
В Python импортировать модули можно несколькими способами:
- импортировать сам модуль
- импортировать отдельные определения из модуля
- импортировать всё содержимое модуля сразу
Импортирование модуля
Рассмотрим применение первого способа — импортирование модуля целиком. Главное удобство упоминания модуля по имени: глядя на код, мы сразу видим, что используемая переменная или вызываемая функция — это часть модуля.
Синтаксис импорта: import <имя_модуля (без суффикса ".py")>
Всё просто: после ключевого слова import указываем имя модуля (файла). Но при этом суффикс .py в имени надо опустить. То есть, к примеру, для модуля с именем my_module.py в инструкции импорта достаточно прописать my_module, а полный вид инструкции будет таким: import my_module.
В модуле (файле) с именем greeting.py определим функцию say_hi и переменную name:
# file: greeting.py
def say_hi():
print('Hi!')
name = 'Bob'
А в модуле с именем main.py сделаем импорт содержимого модуля greeting.py:
# file: main.py
import greeting # заметьте, расширение ".py" не указывается!
print(greeting.name) # => Bob
greeting.say_hi() # => Hi!
Импортирование модуля в таком виде делает модуль доступным по имени — в данном случае это greeting. К содержимому же модуля можно обратиться, как говорят, "через точку". Причём можно как получать доступ к переменным (greeting.name), так и вызывать функции модуля (greeting.say_hi()).
Импортирование отдельных определений
Синтаксис импорта:
from <имя_модуля (без суффикса ".py")> import <список определений>.
Иногда из всего модуля нужна пара функций или переменных, а имя модуля слишком длинное, чтобы писать его каждый раз. Здесь нам может пригодиться следующий вариант использования инструкции import:
# file: main.py
from greeting import say_hi, name
print(name) # используем переменную
say_hi() # вызываем функцию
Здесь после ключевого слова from указано имя модуля, а затем после ключевого слова import — имена определений из этого модуля, которые мы в дальнейшем хотим использовать напрямую (а не "через точку").
Хорошей практикой среди питонистов считается группировка импортов следующим образом:
# file: main.py
from greeting import (
name,
say_hi,
)
print(name) # используем переменную
say_hi() # вызываем функцию
Это очень удобно когда количество импортируемых функций или переменных становится большим и сам импорт занимает несколько строк. Выводя каждую функцию на отдельную строку, при этом расставляя их по алфавиту, мы упрощаем последующее чтение данного кода. А как известно, читать код мы будем куда чаще, чем писать новый код. И не надо забывать о том, что Ваш код будут читать и другие разработчики.
Немного терминологии
Выше мы уже использовали такое словосочетание, как "через точку". Так часто говорят для краткости. Однако для такой формы записи имён определений (module.name) существует и официальный термин: квалифицированное имя от слова "квалифицировать" ("qualify"). Соответственно, "импорт модуля целиком" официально называется квалифицированным импортом.
Также стоит отметить, что в Python все строчки с import принято располагать в самом начале кода модуля. Такой набор строчек часто называют "блоком импортов", хотя синтаксически этот блок никак не выделен — всего лишь обычные строчки одна за другой. Нужна эта группировка во многом для того, чтобы можно было быстро найти, что в текущем модуле откуда пришло — при работе с чужим (и даже своим!) кодом подобным часто приходится заниматься.
Импорт всего содержимого модуля
Мы уже познакомились с модулями и рассмотрели два из трёх вариантов импортирования — импорт самого модуля и импорт отдельных определений. Рассмотрим оставшийся вариант — импортирование всего содержимого модуля. Пример:
from some_module import *
from another_module import *
Здесь из модулей some_module и another_module неявно импортируются все определения. Часто после такого импорта программисту становятся доступны десятки переменных, констант, функций и тому подобного. В этом-то и кроется проблема! Когда ниже по коду программист, читающий этот код, встречает некое имя, то ему бывает очень сложно понять, откуда это имя взялось — нельзя, просто взглянув на блок импортов, найти источник. Поиск по коду модуля тоже не помогает — все имена определений, импортированных данным способом, скрываются за *!
Большинство руководств по написанию хорошего кода на Python крайне не рекомендует использовать такой стиль импортирования. Однако, в реальном коде такие импорты встречаются, поэтому мы не могли не упомянуть этот вариант.
Сочетание способов импортирования
Импортирование модуля целиком (т.е. квалифицированное) и импортирование отдельных определений могут сочетаться даже применительно к одному и тому же модулю.
Давайте, рассмотрим пример.
В модуле computation.py определим функцию и переменные:
# file: computation.py
PI = 3.1415926
E = 2.7182818
def pi_times(x):
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))
Из кода видно, что:
- оба способа импорта использованы совместно,
- импортировать отдельные определения можно в несколько заходов,
- если модуль импортирован по имени, то "через точку" можно получить доступ и к тем определениям, которые уже явно импортированы.