Работа с пакетами в Python

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

Содержание

Введение в пакеты Python

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

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

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

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

Обратите внимание, что начиная с Python 3.3 в Python появилась функция неявных пакетов пространства имен. Это позволяет Python рассматривать папку как пакет без __init__.py.

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

Пакеты продаж в Python

Импорт пакетов

Чтобы импортировать пакет, вы используете оператор импорта следующим образом:

import package.module

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

package.module.function

Ниже показано, как использовать функции в модулях заказа, доставки и выставления счетов из пакета продаж:

# main.py
import sales.order
import sales.delivery
import sales.billing


sales.order.create_sales_order()
sales.delivery.create_delivery()
sales.billing.create_billing()

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

from <module> import <function>

Например:

# main.py
from sales.order import create_sales_order
from sales.delivery import create_delivery
from sales.billing import create_billing


create_sales_order()
create_delivery()
create_billing()

При импорте объект можно переименовать:

# main.py
from sales.order import create_sales_order as create_order
from sales.delivery import create_delivery as start_delivery
from sales.billing import create_billing as issue_billing


create_order()
start_delivery()
issue_billing()

В этом примере мы переименовываем:

  • create_sales_order в create_order,
  • create_delivery в start_delivery,
  • и create_billing в Issue_billing.

Инициализация пакета

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

В следующем примере определяется ставка налога по умолчанию в __init__.py пакета продаж:

# __init__.py

# default sales tax rate
TAX_RATE = 0.07

Из файла main.py вы можете получить доступ к TAX_RATE из пакета продаж следующим образом:

# main.py
from sales import TAX_RATE

print(TAX_RATE)

Помимо инициализации данных уровня пакета, __init__.py также позволяет автоматически импортировать модули из пакета.

Например, в __init__.py, если вы поместите следующий оператор:

# __init__.py

# import the order module automatically
from sales.order import create_sales_order

# default sales tax rate
TAX_RATE = 0.07

И импортируйте пакет продаж из файла main.py, функция create_sales_order будет автоматически доступна следующим образом:

# main.py
import sales

sales.order.create_sales_order()

from <package> import *

Когда вы используете оператор для импорта всех объектов из пакета:

from <package> import *

Python будет искать файл __init__.py.

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

Например, вы можете разместить модули заказа и доставки в списке __all__ так:

# __init__.py

__all__ = [
    'order',
    'delivery'
]

И используйте следующий оператор импорта в main.py:

# main.py
from sales import *


order.create_sales_order()
delivery.create_delivery()

# cannot access the billing module

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

Подпакеты

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

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

Например, все остальные модули, связанные с обработкой заказов, можно разместить в подпакете заказов:

Подпакеты в пакетах

Все, что вы узнали о пакетах, применимо и к подпакетам.

Например, чтобы импортировать функцию из подпакета заказа, вы используете следующий оператор импорта:

# main.py
from sales.order import create_sales_order

create_sales_order()

Заключение

  • Пакет Python содержит один или несколько модулей. Python использует структуру папок и файлов для управления пакетами и модулями.
  • Используйте файл __init__.py, если вы хотите инициализировать данные уровня пакета.
  • Используйте переменную __all__, чтобы указать модули, которые будут автоматически загружаться при импорте пакета.
  • Пакет может содержать подпакеты.
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *