Как сделать модуль в питоне

Обновлено: 06.07.2024

Модули и пакеты в Python – это прекрасные инструменты для управления сложностью в программном проекте. Мы постараемся раскрыть все важные, по нашему мнению, аспекты этой темы и приведем примеры, которые помогут вам лучше во всем разобраться.

Тема модулей и пакетов уже обсуждалась нами в 13-ом уроке проекта “ Python .Уроки”. Основное внимание там было уделено различным способам импортирования модулей, и использованию хранимых в них функций, классов и переменных. Часть информации в этой статье может повторять уже изложенный материал, это сделано для удобства чтения, чтобы не приходилось переключаться между разными источниками.

Введение

В книге “Совершенный Код” Стив Макконнелл формулирует главный технический императив программирования – это управление сложностью . Основная суть, которого заключается в том, что на каждом этапе разработки ПО мы должны прикладывать максимум усилий для того чтобы сложность нашего проекта не “вышла из берегов”. Показателем этого является возможность одновременно удержать в голове основные компоненты проекта на всех уровнях абстракции. В моделировании систем (да и не только там) выделят такой инструмент как декомпозиция – разделение целого на части, этот принцип является одним из наиболее часто используемых способов работать со сложностью. Декомпозицию можно делать на логическом и на физическом уровне. Для реализации последней цели (декомпозиция на физическом уровне) в программном проекте на Python могут служить модули и пакеты.

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

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

Следует заметить, что вы можете импортировать как весь модуль целиком, так и избранные его части.

Быстрый старт

Перейдем к практике. Если вы знакомы с модулями, то можете пропустить этот раздел. Сейчас мы выполним несколько примеров, которые позволят нам получить интуитивное понимание этой темы.

Модули

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

simplemath.py

Создадим ещё один модуль worker.py , который будет использовать функции из simplemath.py . Если мы хотим импортировать все функции, то оператор import для нас отлично подойдет. Это будет выглядеть так.

Получим следующий результат.

Если же нам нужна только функция сложения, то в таком случае лучше воспользоваться оператором from .

worker_from.py

Результат выполнения в этом случае будет такой.

Заметьте, что теперь для вызова функции add() нет необходимости указывать, что она находится в модуле simplemath . В первом случае мы ее вызывали так simplemath.add(1, 2) , теперь достаточно сделать так: add(1, 2) . Вызов функции sub(1, 2) завершился неудачей, т.к. мы его не импортировали.

Пакеты

Создадим папку mathpack и перенесем туда модуль simplemath.py . Теперь, для того, чтобы использовать simplemath в нашем проекте, необходимо изменить процедуру импорта. Если мы просто добавим в import simplemath название пакета в виде префикса, то тогда нужно будет и модифицировать все места вызова функций из simplemath .

worker_pack.py

Это может быть не очень удобным. Можно модифицировать импорт следующим образом:

Тогда в остальном коде ничего не придется менять.

worker_pack_from.py

На этом закончим наш “Быстрый старт” и начнем более детально разбирать темы модулей и пакетов.

Работа импорта – взгляд изнутри

Работа процедуры импорта модуля включает три шага: поиск модуля , компиляция и запуск . Начнем с шага – поиск модуля. Поиска модуля , указанного в импорте, интерпретатор Python , выполняет последовательно в ряде директорий, список которых определен в рамках Module Search Path . Этот список выглядит так:

  • домашняя директория;
  • директории, указанные в переменной окружения PYTHONPATH ;
  • директории Standard library ;
  • пути прописанные в . pth файлах;
  • пакеты сторонних разработчиков.

Домашняя директория – это место, откуда выполняется скрипт. Например, если файлы simplemath.py и worker.py из раздела “Быстрый старт” лежат в директории J:\work , то при запуске скрипта worker.py :

В качестве домашней директории будет выступать J:\work .

Переменная окружения PYTHONPATH задается также как любая другая переменная окружения в используемой вами операционной системе, в ней перечисляются пути, по которым может находиться модуль, указанный в импорте. Например, если модуль simplemath.py, перенести в каталог J:\work\sm , то попытка запустить worker.py завершится неудачей, т.к. не будет найден модуль simplemath.py . После добавления пути J:\work\sm в PYTHONPATH все будет ОК, только не забудьте перезапустить пользовательский сеанс.

При установке Python на вашем компьютере вместе с интерпретатором установится и стандартная библиотека (Standard library) , вот в ней и будет осуществляться поиск модуля, если он не будет найден в рабочей директории и по путям из переменной окружения PYTHONPATH .

Следующее место, где будет искать модуль интерпретатор Python , если не найдет его в стандартной библиотеке – эти пути, прописанные в файлах с расширением .pth . Это обычные текстовые файлы, в которых указываются пути, по которым необходимо производить поиск модулей (каждый путь должен начинаться с новой строки). Данные файлы следует располагать в каталоге Python или в

/lib/site-python . В рамках нашего примера мы удалим в своей системе переменную окружения PYTHONPATH , созданную чуть раньше (если у вас она используется, то можно убрать из нее добавленный нами путь J:\work\sm ). После этого создадим в директории C:\Python35-32 файл workerpath.pth со следующим содержимым.

workerpath.pth

Этого будет достаточно, чтобы скрипт worker.py запустился удачно.

Ну и последняя на очереди директория, в которой будет осуществляться поиск импортированного модуля – это lib/site-packages . В ней, как правило, располагаются пакеты, от сторонних разработчиков, устанавливаемые средствами Python .

После того, как модуль был найден, производится его компиляция в байт-код, если это необходимо. Это делается в том случае, если байт-код более старый по сравнению с файлом с исходным кодом (или запускается в другом интерпретаторе). В Python 3 после компиляции создается каталог с именем __pycache__ , в нем располагаются файлы с расширением . pyc , в них содержится байт-код.

После этого следует процедура запуска модуля, которая заключается в последовательном выполнении строк кода в соответствующем модуле. Важно помнить, что модуль импортируется только один раз, при этом, если вы еще раз выполните процедуру импорта, то модуль загружен не будет. Перезагрузить модуль можно с помощью команды imp.reload .

Модули

Создание и импортирование модулей

Как мы уже говорили ранее модули – это файлы с расширением . py . Если мы импортируем модуль с помощью import , то получаем доступ к глобальным переменным модуля и его функциями.

Например, импортируем модуль с именем module .

Пусть в module содержится глобальная переменная value и функция calc_value() , тогда доступ к ним мы можем получить так.

Такая работа напоминает взаимодействие с объектами классов, когда мы получаем доступа к атрибутам и методам объекта. Имена модулей должны выбираться также как имена переменных, иначе их нельзя будет импортировать. Так, если вы назовете модуль while.py , то импортировать его будет нельзя.

Далее, кратко пройдемся по тому, как можно импортировать модули. Для примера будем использовать вышесозданный simplemath.py .

Первый способ импорта модуля

Для доступа к элементам simplemath необходимо использовать имя модуля и далее, через точку, как при работе с атрибутами классов, указывать переменные или функции. Вызов add() будет выглядеть так.

Второй способ импорта модуля

В этом случае функцию add() можно вызывать напрямую, без указания имени модуля. При этом остальные функции из simplemath , такие как sub(), mul() и div() будут недоступны.

Такой подход позволяет импортировать все доступные элементы модуля (переменные, функции, классы), для работы с ними не требуется использовать имя модуля.

Что ещё нужно знать про импорт модулей?

Следует помнить о том, что import и from – это исполняемые выражения, и выполняются они в процессе исполнения скрипта, а не на этапе компиляции. Это позволяет гибко подходить к процессу импортирования: использовать условные выражения и т.п.

В нашем распоряжении есть модуль simplemath.py . Создадим ещё один модуль с иметем advmath.py.

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

selectimport.py

Теперь обсудим вопрос модификации данных в импортируемых модулях. Если вы импортируете модуль через оператор import , то в пространстве имен вашей программы появляется объект-модуль с соответствующим именем, аргументы которого – это переменные в модуле.

Создадим модуль vars.py.

В этом модуле содержатся две переменные ( value и array ) и две функции ( get_value() и set_value() ), позволяющие модифицировать и получать значение переменной value .

Если мы импортируем данный модуль с помощью import , то получим следующие возможности.

Доступ к переменным осуществляется через соответствующие атрибуты объекта-модуля.

Вывоз функций организован как вызов методов объекта-модуля.

При этом мы можем менять значение переменных из модуля vars напрямую, используя атрибуты.

Если же мы импортируем модуль vars через from , то работа с его элементами будет отличаться от рассмотренного выше сценария. Переменные value и array будут скопированы в текущую область видимости. Это приведет к ряду последствий.

Для доступа к переменных из модуля vars теперь не нужно указывать имя модуля.

Но при этом переменная value – это уже новая переменная в текущей области видимости, т.е. она находится вне контекста модуля vars .

Если мы дополнительно импортируем модуль через import , то можно показать, что модификация value в текущем контексте не затронет переменную value в модуле vars . Импортируем модуль vars через импорт и выведем значение value в нем.

Модифицируем value в текущем контексте.

Это изменение не коснулось value из модуля vars . Теперь изменим vars.value .

Т.е. value и vars.value – это две разные переменные, значения которых никак не связаны друг с другом. Другое дело мутабельные переменные, в нашем примере – это array .

Пока значения совпадают, так и должно быть. Модифицируем array .

Этот эффект наблюдается и в обратную сторону.

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

Перезагрузка модуля

Напомним, что после загрузки, модуль уже не будет перезагружаться при повторном вызове import , даже если внести в него какие-нибудь изменения. Обратимся к примерам из предыдущего раздела.

Импортируем модуль vars .

Поменяем в файле vars.py строку value = 1 на value = 7 .

Ничего не поменялось.

Для перезагрузки модуля необходимо воспользоваться функцией reload() из модуля imp .

И напоследок, все что импортируется из модуля можно получить через функцию dir() .

Пакеты

В первом приближении пакеты в Python можно воспринимать как каталоги, в которых лежат модули (на самом деле все сложнее). Для того, чтобы импортировать модуль из пакета, необходимо в import передать весь путь до модуля с перечислением пакетов, разделяя их точками.

Если перенести модуль vars.py (см. предыдущий раздел) в каталог simple , то импорт будет выглядеть так.

При этом для доступа к элементу value необходимо указывать всю иерархию вложения.

Для того, чтобы каталог стал пакетов в его формальном представлении в рамках языка Python , необходимо в него поместить файл __init__.py . Основное назначение этого файла – это предварительная инициализация пакета, если она необходима. В самом простом случае – он может быть пустым.

Если в файле __init__.py есть какой-то код, то он будет выполнен сразу после выполнения процедуры импорта.

Тема пакетов будет развита более детально несколько позднее.

На этом пока все! Со временем, если будет появляться интересная информация, и какие-то полезные практики использования модулей и пакетов, эта статья будет расширяться

Модули и пакеты в Python. Глубокое погружение : 6 комментариев

Тут ошибка:
>>> vars.get_value()
1
>>> vars.set_value(5)
>>> vars.get_value()
5
Выведет не 5, а 1

def set_value(new_value):
global value
value = new_value

Мне очень понравилось ваше объяснение будущему так сказать программисту. Спасибо огромное за вашу помощь.

Добрый день.
Есть вопрос по подключению модуля.
Есть самописная программа (нужна по работе). Там подключение модуля requests.
На работе права администратора для установки модуля не дают.
Как его можно подключить к программе, не запрашивая права администратора для установки из pip?
Сработает ли подключение модуля, если его скопировать в папку с исполняемым файлом из \Lib\site-packages?

Модули – это организационная единица самого высокого уровня в Python. Если вы хотя бы немного знакомы с Python, вероятно уже использовали готовые модули или создали свои. Что же такое модуль? Модули – это программные единицы, хранящие код и данные, обеспечивающие повторное использование кода для Python проектов и также полезны при разбиении пространств имён в автономных пакетах. Они автономны, потому что получить доступ к атрибутам модуля только после их импорта. Их также можно рассматривать, как пакеты имён, которые при импорте становятся атрибутами импортированного модуля. Фактически, любой файл Python с расширением *.py является модулем.

Создание модуля

Для создания модуля в Python достаточно определить файл с суффиксом .py. Хотя не каждый файл Python предназначен для импорта в качестве модуля. Файлы Python, которые используются для работы в качестве автономного приложения Python (файлы верхнего уровня), обычно предназначены для запуска в виде скриптов, а импорт их, фактически запускает команды внутри скрипта.

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

Запустим файл my_script.py в терминале:

Как отмечалось ранее, важный вывод из этого первого базового примера – это то, что важны имена файлов модулей. После импорта они становятся переменными/объектами в модуле импортера. Все определения верхнего уровня в модуле становятся атрибутами этой переменной.

Архитектура программы

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

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


На этом рисунке модуль top_module.py – это файл Python верхнего уровня, который импортирует функции, определенные в модуле module1, но также имеет доступ к функциям в module2 через module1. Два пользовательских модуля используют ресурсы друг друга, а также другие модули из стандартной библиотеки Python. Цепочка импорта может идти настолько глубоко, насколько нужно – нет ограничений в количестве импортированных файлов, и они могут импортировать друг друга, хотя нужно быть осторожным с циклическими импортами.

В приведенном выше примере top_module.py – это модуль верхнего уровня, который будет запускаться пользователем, и он импортирует инструменты из других модулей через module1.py. module1 и module2 являются определяемыми пользователем модулями, а модуль math импортируется из стандартной библиотеки. При запуске скрипта верхнего уровня получаем:

$ python top_module.py k = 2 n = 5
10.0

Когда запускается файл Python верхнего уровня, его операторы исходного кода и операторы в импортированных модулях компилируются в промежуточный формат, известный как байт код, который является независимым от платформы. Файлы байт кода импортированных модулей хранятся с расширением .pyc в том же каталоге, что и .py-файл для версий Python до 3.2, и в каталоге pycache/ в текущем каталоге программы в Python 3.2+.

Двухрежимный код

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

Пример двухрежимного кода:

Если файл запускается как отдельная программа, то такая же функция вызывается автоматически. Разница здесь, по сравнению с примером my_script.py в разделе main, заключается в том, что когда hiprinter.py импортируется, он не будет запускать код, вложенный в оператор if name == 'main'.

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

Оператор import

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

Использование инструкции from разрешено только в файле верхнего уровня модуля в Python 3.x, а не внутри функции. Python 2.x позволяет использовать его в функции, но выдает предупреждение. Оператор from медленнее import, поскольку он выполняет всю работу, которую выполняет import через весь контент импортированного модуля, а затем выполняет дополнительные действия при выборе соответствующих имён для импорта.

Существует также третий оператор импорта *, который используется для импорта всех имен в верхний уровень из импортированного модуля и использования их непосредственно в классе импортера. Например:

Код импортирует все имена (переменные и функции) из файла module2.py. Этот подход не рекомендуется из-за возможного дублирования имен, импортированные имена могут перезаписывать уже существующие имена в модуле импортера.

Каталог поиска модуля

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

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

  1. Домашняя директория программы. Расположение сценария верхнего уровня. Обратите внимание, что домашний каталог может не совпадать с текущим рабочим каталогом.
  2. Каталоги, перечисленные в переменной окружения PYTHONPATH.
  3. Стандартные библиотечные каталоги. Каталоги автоматически устанавливаются с установкой Python и в них всегда выполняются поиск.
  4. Каталоги, перечисленные в .pth файлах. Этот вариант является альтернативой PYTHONPATH, и он добавляет ваши каталоги, указанные по одному в строке, в текстовый файл с суффиксом .pth, который должен быть помещен в каталог установки Python, который обычно является /usr/local/lib/python3.6/ в Unix или C:\Python36\ в Windows.
  5. Каталог site-packages. В этом каталоге автоматически располагаются все сторонние расширения.

PYTHONPATH, вероятно, является наиболее предпочтительным способом. Вы можете легко проверить, установлена ли переменная на вашем компьютере выполнив в командной строке:

После того, как все каталоги поиска во время запуска программы будут определены, они сохраняются в списке, который можно увидеть с помощью sys.path. Также можно добавить каталог в sys.path, а затем импортировать свои модули, которые будут изменять каталоги поиска во время выполнения программы.

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

Как показано в следующем примере, пустая строка в начале списка определяет текущий каталог:

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

Перезагрузка модуля

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

Например, импортируем код в my_module.py в интерпретаторе Python, затем изменим файл и снова импортируем.

Чтобы отключить кеширование и включить повторный импорт модулей, Python предоставляет функцию reload. Повторим пример:

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

Например, для программ, которым требуется постоянная связь с сервером, гораздо сложнее перезапустить все приложение, чем выполнять динамическую перезагрузку для выполнения во время разработки.

Пакеты модулей

Как импортировать пакеты модулей? Давайте создадим каталог с именем mydir, который включает в себя модуль mod0.py и два подкаталога subdir1 и subdir2, содержащий модули mod1.py и mod2.py соответственно. Структура каталогов выглядит так:

Обычный подход, который объяснялся до сих пор, заключался в том, чтобы добавить пути mydir, subdir1 и subdir2 к каталоги поиска модуля (sys.path), чтобы иметь возможность импортировать mod0.py, mod1. py и mod2.py. Это может привести к большим накладным расходами, если модули распределены по множеству разных подкаталогов. В любом случае, импорт пакетов будет предпочтительнее, потому что работают с импортом имени самой папки.

Недопустимая инструкция, приводящая к ошибке InvalidSyntax:

Правильный способ выполнить это – установить каталог /Users/Code/Projects/ в путь поиска модуля (добавив его в переменную среды PYTHONPATH или указав её в файле .pth), а затем импортировать модули, используя точечный синтаксис.

Вы, наверное, уже замечали, что некоторые Python каталоги содержат файл init.py. Это было фактически требование в Python2.x, чтобы сообщить Python, что ваш каталог является пакетым модулем. Файл init.py также является обычным файлом Python, который запускается всякий раз, когда этот каталог импортируется, и подходит для инициализации значений, например, для подключения к базе данных.

В большинстве случаев эти файлы просто пусты. В Python3.x эти файлы являются необязательными, и их можно использовать, если это необходимо. Следующие несколько строк показывают, как имена, определенные в init.py, становятся атрибутами импортируемого объекта (имя каталога, содержащего его).

Еще одна важная тема, когда речь идёт о пакетных модулях – относительный импорт. Относительный импорт полезен при импорте модулей внутри самого пакета. В этом случае Python будет искать импортированный модуль внутри пакета, а не в путях поиска модуля.

Строка импорта mod2 сообщает Python о поиске модуля mod2 в sys.path, и поэтому он не увенчался успехом. В данном случае нам поможет относительный импорт. Следующий оператор относительного импорта использует двойную точку (".."), которая обозначает родительский элемент текущего пакета ('mydir /'). Для создания полного относительного пути к модулю mod2 необходимо включить следующий subdir2.

Относительный импорт – это огромная тема, которая может занять целую книгу. Они также сильно отличаются между версиями Python2.x и 3.x. Поддержка Python 2.x заканчивается в 2020 году, поэтому в тех случаях, когда существует большая разница между версиями Python, например, в относительном импорте, лучше сосредоточиться на версии 3.x.

Публикация пакета в PyPi

На текущий момент вы узнали, как писать модули Python, различать импортируемые модули и высокоуровневые, использовать определенные пользователем модули в границах каталога, изменять путь поиска модулей и, кроме всего прочего, создавать/импортировать пакеты модулей. После создания полезного программного обеспечения, упакованного в пакет модулей, вы можете поделиться им с большим сообществом Python. Пакетный индекс Python (PyPi) – это программный репозитарий, в настоящее время содержащий более 120 тыс. пакетов (на момент написания этой статьи). Возможно, вы уже устанавливали модули из репозитория с помощью команды pip.

Например, следующая строка загрузит и устанавливать библиотеку Numpy:

Как опубликовать свой пакет в репозитарии? Во-первых, он должен удовлетворять требованиям к упаковке и распространению. Необходимо выполнить два условия: установить pip, setuptools, wheel и установить twine, который используется для загрузки проекта в PyPi.

Следующим шагом будет настройка вашего проекта. В общем, это означает добавление нескольких файлов Python в проект, которые будут содержать информацию о конфигурации, руководства по использованию и т. д. Далее перечислены самые важные файлы, которые нужно добавить: setup.py. Этот файл необходимо добавить в корень проекта и использовать в качестве интерфейса установки из командной строки. Он должен содержать функцию setup(), которая будет принимать в качестве аргумента информацию, такую как: имя проекта, версия, описание, лицензия, зависимости проекта и т. д. README.rst: текстовый файл, описывающий пакет. licence.txt: текстовый файл, содержащий лицензию на программное обеспечение.

Наиболее востребованным форматом пакета является wheel. Запуск одной из следующих команд приведет к созданию каталога dist/ в корне вашего проекта, который содержит файлы в пакет для загрузки в PyPi.

Последний шаг – загрузка вашего дистрибутива в PyPi. Для этого нудно создать учетную запись на сайте PyPi и загрузить содержимое каталога dist/, созданного на предыдущем шаге.

Для получения дополнительной информации обратитесь к официальному сайту PyPi.

Рассматриваем модули и пакеты из стандартной библиотеки Python и PyPI. Учимся использовать инструкции import и from..import и различать абсолютный и относительный импорт. Разбираемся с виртуальными пространствами venv. Создаем собственные модули.

Logo Python Course Lesson 5

Рассматриваем модули и пакеты из стандартной библиотеки Python и PyPI. Учимся использовать инструкции import и from..import и различать абсолютный и относительный импорт. Разбираемся с виртуальными пространствами venv. Создаем собственные модули.

One

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

Что такое модуль в терминологии Python? Официальная документация дает следующее определение:

Python Модуль

Module - an object that serves as an organizational unit of Python code. Modules have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of importing.

Иными словами, модуль(module) в Python - это просто файл, содержащий код на Python. Каждый модуль может содержать переменные, классы и функции. Кроме того, в модуле может находиться исполняемый код. Имя модуля соответствует имени файла. Например:

Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python(обычные модули), а например, на C или C++(модули расширения).

  1. Имеет расширение *.py (имя файла без расширения является именем модуля).
  2. Может быть импортирован.
  3. Может быть многократно использован.
  4. Позволяет вам логически организовать ваш код на Python.

Two

Идем дальше. Если начать делить код достаточно большого проекта на модули, то довольно быстро может возникнуть желание сгруппировать несколько близких по тематике модулей. Или же мы захотим вынести часть модулей из проекта, чтобы их можно было использовать в других проектах. И тут нам на помощь приходят пакеты(packages) в Python, которые служат для объединения модулей в группы.

Вот что на эту тему говорит документация Python:

Python Пакет

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

На самом деле
Некоторые пакеты Python не содержат файл __init__.py . Это так называемые namespace package s, которые служат просто как контейнеры подпакетов. Однако мы не станем на них подробно останавливаться, просто будем иметь ввиду, что такие пакеты существуют. Подробнее можно почитать в PEP 420.

Пример содержимого каталога стандартного пакета json , который, как можно заметить, состоит из 4 модулей и файла __init__.py :

  1. Именем пакета является название данного каталога.
  2. С версии Python 3.3 любая папка (даже без __init__.py ) считается пакетом.
  3. Пакет может быть импортирован(так же как и модуль).
  4. Пакет может быть многократно использован(так же как и модуль).

Three

  1. Стандартная библиотека Python (англ. Standard Library).
  2. Сторонние модули (англ. 3rd Party Modules)
  3. Пользовательские модули

Python. Классификация модулей.

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

1. Стандартная библиотека Python

sys; Обеспечивает доступ к некоторым переменным и функциям, взаимодействующим с интерпретатором Python, например - доступ к аргументам командной строки, списку встроенных модулей Python, текущим исключениям, информации об операционной системе. os; Предоставляет множество функций для работы с операционной системой. Например, получение версии и другой информации о текущей ОС, работа с переменными окружения и файловой системой. os.path; Является вложенным в модуль os(по сути os является пакетом), и реализует некоторые полезные функции для работы с файлами - доступ к характеристикам файла и манипуляции с путями. time, datetime; Данные модули предоставляют классы для обработки времени и даты разными способами. random; Предоставляет функции для генерации случайных чисел, букв, случайного выбора элементов последовательности. collections;Предоставляет специализированные типы данных - счетчики, очереди, упорядоченные словари. json; Позволяет кодировать и декодировать данные в формате JSON. unittest; Предоставляет богатый набор инструментов для написания и запуска автоматизированных тестов. re;Модуль re используется для работы с регулярными выражениями. hashlib;Предназначен для шифрования строк. bz2, gzip, tarfile, zipfile;Данные модули созданы для архивации/распаковки данных в разных форматах.

2. Сторонние модули (англ. 3rd Party Modules)

Это модули и пакеты, которые не входят в дистрибутив Python и могут быть установлены из каталога пакетов Python с помощью пакетного менеджера (например, pip или easy_install ).

PyPI (Python Package Index) - главный каталог библиотек на Python. Содержит более 200 000 пакетов.

Приведем несколько примеров популярных пакетов из каталога PyPI.

3. Пользовательские (собственные) модули
Python предоставляет возможность создания собственных модулей. Для создания таких модулей нет особенных правил - любой файл с расширением *.py является модулем, а создается, как правило, разработчиком для собственных нужд. В подавляющем большинстве случае такой пакет или модуль не размещается в каталоге пакетов Python.

Favorite

Добавить в избранное

Python 3 - Обзор

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

Создание модулей Python

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

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

Вызовите свой модуль

Давайте вызовем этот модуль в нашем другом скрипте Python с помощью команды import.

Вызов переменных модуля

Мы также можем объявить переменные в наших самостоятельно созданных модулях Python, присвоить значения этим переменным и вызвать их в нашем скрипте Python. Модули также могут содержать словари, списки и т. д.

Теперь давайте вызовем переменные и объекты в другом скрипте Python.

Список всех функций и переменных модуля

Теперь давайте вызовем функцию dir () в нашем скрипте Python.

Вывод

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: