Python зачем нужны пакеты

Пакеты — Основы Python

Обычно код в больших проектах делят на модули — отдельные файлы, в которых хранится код на Python. Но иногда и этого разделения недостаточно. Часто модули хочется сгруппировать «по смыслу» или сформировать отдельную группу модулей, чтобы использовать их в других проектах.

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

Создаем пакет

С точки зрения структуры пакет — это каталог (директория) с файлами модулей, имеющий имя в формате snake_case и содержащий специальный модуль с именем « __init__.py ». Именно наличие этого специального файла подсказывает интерпретатору Python, что каталог следует воспринимать как пакет.

Рассмотрим пример самого простого пакета. Создадим пакет из каталога package и модуля __init__.py внутри этого каталога:

В файл __init__.py добавим следующий код:

# file __init__.py NAME = 'super_package' 

Теперь у нас есть небольшой, но уже полноценный пакет. Его можно импортировать так же, как модуль:

import package print(package.NAME) 

Обратите внимание, что отдельно импортировать файл __init__.py не нужно. При первом обращении к пакету Python самостоятельно импортирует модуль __init__.py . Это происходит автоматически, потому что каталог без init-файла не будет считаться пакетом.

Добавляем модули в пакет

С простым пакетом все ясно — его можно использовать как модуль. Теперь перейдем к группировке. Добавим в пакет еще два модуля:

Чтобы было понятнее, рассмотрим содержимое модуля constants.py :

# file constants.py PERSON = 'Alice' 

И содержимое модуля functions.py :

# file functions.py def greet(who): print('Hello, ' + who + '!') 

Теперь в пакете есть не только __init__.py , но и еще два модуля — теперь их можно импортировать.

Как импортировать пакеты

В уроке про модули упоминались два распространенных варианта:

  • Квалифицированный импорт (также его называют «импорт модуля целиком»)
  • Импорт отдельных определений

Применим оба способа импорта — но теперь уже не к модулям, а к пакетам.

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

import package.functions import package.constants package.functions.greet(package.constants.PERSON) # => Hello, Alice! 

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

Читайте также:  Php copy files ftp

Попробуем импортировать отдельные определения, то есть саму функцию и аргумент:

from package.functions import greet from package.constants import PERSON greet(PERSON) # => Hello, Alice! 

Кроме того, импорты в Python бывают двух видов:

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

Абсолютный импорт

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

Относительный импорт

Относительные импорты выглядят так:

from . import module from .module import function from .subpackage.module import CONSTANT 

В относительном импорте используется точка, которая означает импорт модуля из текущей директории.

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

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

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Источник

Урок 5.
Модули и пакеты в Python. Импорт. Виртуальная среда venv.

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

Logo Python Course Lesson 5

Курс «Программирование на Python»

Рассматриваем модули и пакеты из стандартной библиотеки 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.

Читайте также:  Web development using html

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

 # Имя файла math.py # Имя модуля math 

Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на 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 :

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

Three

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

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

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

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

  1. Встроенные модули. Входят в состав интерпретатора и написаны на языке С, что позволяет им обеспечивать эффективный доступ к функциональности на уровне ОС — например, к системе ввода-вывода данных. Многие из встроенных модулей являются платформозависимыми. Например, модуль winreg , предназначенный для работы с реестром ОС Windows, устанавливается только на соответствующей ОС.
  2. Модули расширения. Написаны на Python. Представляют собой стандартные способы решения наиболее часто встречающихся задач программирования. Сюда входят модули для работы со многими сетевыми протоколами и форматами интернета, регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, а также для сериализации данных, поддержки юнит-тестирования и др.
Читайте также:  Адаптивная потоковая передача javascript

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.

six;Библиотека совместимости Python 2 и 3. Содержит функции, сглаживающие различия в версиях Python. urllib3;HTTP клиент для Python requests;HTTP клиент для Python. Технически является более удобной оберткой над urllib3. python-dateutil; Расширяет функционал по работе со временем и датой относительно модуля datetime из Стандартной библиотеки Python. docutils;Библиотека-процессор для документов написанных с помощью разметки ReST. pyyaml;YAML парсер/генератор awscli;Предоставляет интерфейс командной строки для Amazon Web Services numpy;Пакет для вычислений с многомерными массивами. Его можно рассматривать как свободную альтернативу MATLAB. pytest;Библиотека для создания и запуска автоматизированных unit тестов(альтернатива unittest) flask;Фреймворк для создания веб-приложений на Python

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

Источник

Оцените статью