4.1 Пакеты и модули

4.1 Пакеты и модули#

Инструкция import#

До этого мы рассматривали только встроенные элементы Python. На практике же нам часто нужно будет переиспользовать свой код, написанный в других файлах, и использовать сторонний код. Чтобы разобраться, как это можно сделать, нужно ввести два понятия: модули и пакеты. Модуль - это любой исполняемый файл, в котором содержатся инструкции (как правило, это файлы с расширением .py). Пакет - это директория, хранящая в себе модули. А также нам понадобится import, позволяющий загружать модули и пакеты в текущий исполняемый файл. Инструкция импорта производится следующим образом:

import <имя_пакета/имя_модуля>
import <путь/до/нужного/модуля>

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

Первое, на чем мы остановимся, - это модуль sys. Данный модуль предоставляет доступ к переменным и настройкам интерпретатора.

# Как правило, все импорты указываются в самом начале файла, перед любым другим кодом
import sys
sys
<module 'sys' (built-in)>

Импортируя модуль sys, мы фактически выполняем весь код в файле этого модуля и получаем доступ ко всем функциям и переменным, которые были в нем описаны. Так мы можем обратиться к переменной path, которая содержится в модуле sys:

sys.path
['/usr/lib/python312.zip',
 '/usr/lib/python3.12',
 '/usr/lib/python3.12/lib-dynload',
 '',
 '/home/runner/work/spatial-python/spatial-python/.venv/lib/python3.12/site-packages']

Переменная path - это список, который содержит в себе все пути, где Python будет искать модули и пакеты, которые мы импортируем. Если посмотреть внимательнее на ее содержимое, то мы увидим несколько системных директорий, куда установлен Python - это места, откуда импортируется стандартная библиотека; директорию ../site-packages - место, откуда будут импортироваться пакеты, устанавливаемые из интернета; и, как правило, текущую директорию, что позволит нам легко импортировать функции и переменные из соседних файлов.

Инструкция import from#

Зачастую нам не нужно будет импортировать модули и пакеты полностью. Так, например, если нам нужна только переменная sys.path, то нет смысла импортировать модуль sys полностью. Чтобы импортировать из него только нужную переменную или функцию, можно воспользоваться конструкцией from ... import ...

from sys import path

path
['/usr/lib/python312.zip',
 '/usr/lib/python3.12',
 '/usr/lib/python3.12/lib-dynload',
 '',
 '/home/runner/work/spatial-python/spatial-python/.venv/lib/python3.12/site-packages']

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

Если всё же возникает ситуация, когда мы хотим описать в исходном модуле функции, которые дальше будем переиспользовать в других модулях, и в то же время оставить в исходном модуле код, который должен исполняться только при явном вызове модуля (не при его импорте), то можно воспользоваться встроенной переменной __name__. Переменная __name__ определяется сама и хранит значение, обозначающее, как был вызван модуль. Так, если мы сами выполним команду для исполнения модуля, то __name__ == '__main__'. Если модуль будет выполнен в результате импорта, то значение будет отличаться. Таким образом в коде часто можно встретить такую конструкцию:

if __name__ == '__main__':
    # Инструкции внутри такого условия не выполнятся при импорте
    # Инструкции внутри такого условия выполнятся, если явно запустить модуль
    print(...)
Ellipsis

Псевдонимы#

Также часто можно столкнуться с ситуацией, когда в процессе импорта нужно импортировать две переменные или функции с одинаковым именем, либо в результате импорта в текущем коде будут возникать одинаковые имена. По умолчанию такие имена будут переопределяться, и мы сможем обратиться только к тому имени (из двух одинаковых), которое было определено или импортировано последним. Чтобы сохранить доступ ко всем объектам, при импорте можно пользоваться псевдонимами.

from sys import path as sys_path  # После стандартного импорта добавляется as и новое имя

sys_path
['/usr/lib/python312.zip',
 '/usr/lib/python3.12',
 '/usr/lib/python3.12/lib-dynload',
 '',
 '/home/runner/work/spatial-python/spatial-python/.venv/lib/python3.12/site-packages']

Модули стандартной библиотеки

Среди множества полезных модулей стандартной библиотеки стоит обратить особое внимание на следующие:

  • math - Набор математических констант и функций (включая тригонометрические)

  • datetime - Модуль для работы с типом данных времени

  • collections - Набор дополнительных структур данных\типов данных для оптимизации алгоритмов

  • itertools - Набор функций итераторов с разными вариантами перебора последовательностей

  • re - Модуль для работы с регулярными выражениями (поиска подстрок по сложным шаблонам)