Модули и пакеты

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

Существующие в модуле имена называются атрибутами.

Для сохранения программ на постоянной основе нам необходимо записывать код в файлы, которые обычно известны как модули.

Модули - это просто текстовые файлы, содержащие операторы Python. Независимо от способа запуска Python каждый раз выполняет весь код в файле модуля от начала до конца.

Терминология в этой области может кое в чем отличаться. Например, на файлы модулей часто ссылаются как на программы в Python - то есть программой считается последовательность готовых операторов, сохраненных в файле для многократного выполнения.

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

Некоторые используют термин "модуль" для файла, импортируемого из другого файла, а "сценарий" - для главного файла программы.

Запустим среду разработки, создадим новый проект и откроем файл main.py, куда добавим следующий код

import sys
print(sys.platform)

Файл main.py является нашим сценарием Python.

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

Обратите внимание, что файл модуля называется main.py. Как и любой файл верхнего уровня, его можно было бы назвать просто main, но имена файлов кода, которые вы хотите импортировать на стороне клиента, должны заканчиваться суффиксом .py.

Модули обрабатываются с помощью двух операторов и одной функции:

  • import - позволяет клиенту (импортеру) извлечь модуль как единое целое;

  • from - позволяет клиентам извлекать отдельные имена из модуля;

  • imp.reload - предоставляет способ перезагрузки кода модуля.

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

Модули исполняют, по крайней мере, три роли.

  1. Многократное использование кода - код в файлах модулей постоянен - его можно перезагружать и повторно запускать столько раз, сколько нужно.

Модуль представляет собой файл с программным кодом. Он определяет группу функций Python или других объектов, а имя модуля определяется именем файла.

Модули часто содержат исходный код Python, но они также могут содержать откомпилированные объектные файлы C и C++. Откомпилированные модули и исходные файлы Python используются одинаково.

Помимо группировки взаимосвязанных объектов Python, модули способствуют предотвращению конфликтов имен.

Предположим, вы пишете для свой программы модуль с именем mymodule, который определяет функцию reverse(). В той же программе может использоваться модуль othermodule, который также определяет функцию с именем reverse(), которая делает нечто отличное от вашей функции reverse(). Без использования механизма модулей невозможно использовать две разные функции reverse(). В Python это делается тривиально: вы просто обращаетесь в программе к функциям с именами mymodule.reverse и othermodule.reverse.

Использование имен модулей помогает отделить две функции reverse() друг от друга, потому что Python использует пространства имен. Пространство имен фактически представляет собой словарь идентификаторов, доступных в блоке, функции, классе, модуле и так далее.

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

Такая модуль служб на основе модулей является основной идеей программной архитектуры в Python. Более крупные программы обычно принимают форму множества файлов модулей, которые импортируют инструменты из других файлов модулей. Один из модулей предназначен быт главным файлом либо файлом верхнего уровня, или "сценарием" - файлом, запускаемым для старта целой программы, которая выполняется строка за строкой обычным образом. Ниже данного уровня все модули импортируют другие модули.

Операции импорта в качестве финального шага выполняют код в загружаемом файле. Из-за этого импортирование файла является еще одним способом его запуска.

Пространство имен

Пространство имен - это система, которая гарантирует, что все имена в программе уникальны и могут использоваться без каких-либо конфликтов.

Python реализует пространство имен как словари. Существует сопоставление "имя-объект" с именами в виде ключей и объектов в качестве значений. Несколько пространств имен могут использовать одно и то же имя и сопоставлять их с другим объектом. Вот несколько примеров пространств имен:

  • локальное пространство имен - это пространство имен содержит локальные имена внутри функции. Это пространство имен создается при вызове функции и продолжается до тех пор, пока функция не вернется;

  • глобальное пространство имен - это пространство имен, которое включает имена из различных импортированных модулей, которые вы используете в проекте. Оно создается, когда модуль включен в проект, и оно существует до завершения скрипта;

  • встроенное пространство имен - это пространство имен содержит встроенные функции и встроенные имена исключений.

Что такое область?

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

  • локальная область, которая является самой внутренней областью, которая содержит список локальных имен, доступных в текущей функции;

  • область всех закрывающих функций. Поиск имена начинается с ближайшей охватывающей области и перемещается наружу;

  • область уровня модуля, содержащая все глобальные имена из текущего модуля;

  • область, которая содержит список всех встроенных имен. Поиск в этой области выполняется последним

Last updated