Работа с пакетами в Python
В этом руководстве вы узнаете о пакетах Python и о том, как с ними работать и использовать их для структурирования вашего приложения.
- Введение в пакеты Python
- Импорт пакетов
- Инициализация пакета
- from <package> import *
- Подпакеты
- Заключение
Введение в пакеты Python
Предположим, вам нужно разработать большое приложение, которое обрабатывает процесс продаж от заказа до получения денег.
Приложение будет иметь множество модулей. Когда количество модулей вырастет, удержать их все в одном месте станет сложно. И вы можете сгруппировать модули во что-то значимое.
Здесь в игру вступают пакеты. Пакеты позволяют организовывать модули в иерархическую структуру. То, как Python организует пакеты и модули, например операционная система, структурирует папки и файлы.
Чтобы создать пакет, вы создаете новую папку и помещаете в нее соответствующие модули. Чтобы указать Python рассматривать папку, содержащую файлы, как пакет, вам необходимо создать в этой папке файл __init__.py.
Обратите внимание, что начиная с Python 3.3 в Python появилась функция неявных пакетов пространства имен. Это позволяет Python рассматривать папку как пакет без __init__.py.
Например, на следующем рисунке показан пакет продаж, содержащий три модуля, включая заказ, доставку и выставление счетов:
Импорт пакетов
Чтобы импортировать пакет, вы используете оператор импорта следующим образом:
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__, чтобы указать модули, которые будут автоматически загружаться при импорте пакета.
- Пакет может содержать подпакеты.