Создание пакета Python

Beginner

This tutorial is from open-source community. Access the source code

Введение

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

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

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 67%. Он получил 100% положительных отзывов от учащихся.

Понимание пакетов Python

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

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

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

ls -l

Когда вы запустите эту команду, вы должны увидеть следующие файлы:

portfolio.csv
reader.py
stock.py
structure.py
tableformat.py
validate.py

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

Давайте кратко разберем, что делает каждый файл:

  • structure.py: Этот файл определяет базовый класс Structure и различные дескрипторы. Эти дескрипторы используются для валидации типов, то есть они помогают убедиться, что данные, используемые в вашей программе, имеют правильный тип.
  • validate.py: В нем содержится функциональность валидации, которая используется модулем structure. Это помогает валидировать данные в соответствии с определенными правилами.
  • reader.py: Этот файл предоставляет функции, которые используются для чтения данных в формате CSV. CSV (Comma - Separated Values) - это распространенный формат файлов для хранения табличных данных.
  • tableformat.py: В нем содержатся классы и функции, которые используются для форматирования данных в таблицы. Это полезно, когда вы хотите отобразить данные более организованно.
  • stock.py: Этот файл использует другие модули для определения класса Stock и обработки данных о акциях. Он объединяет функциональность других модулей для выполнения конкретных задач, связанных с данными о акциях.

На следующем шаге мы создадим структуру нашего пакета.

Создание структуры пакета

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

  1. Создать каталог с именем пакета. Этот каталог будет служить контейнером для всех модулей, принадлежащих пакету.
  2. Создать файл __init__.py внутри этого каталога. Этот файл является важным, так как он заставляет Python распознавать каталог как пакет. Когда вы импортируете пакет, выполняется код из файла __init__.py, который можно использовать для инициализации пакета.
  3. Переместить наши файлы модулей Python в этот каталог. Этот шаг обеспечивает группировку всего связанного кода внутри пакета.

Давайте создадим структуру пакета пошагово:

  1. Сначала создайте каталог с именем structly. Это будет корневой каталог нашего пакета.
mkdir structly
  1. Затем создайте пустой файл __init__.py внутри каталога structly.
touch structly/__init__.py

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

  1. Теперь давайте переместить наши файлы модулей Python в каталог structly. Эти файлы модулей содержат функции и классы, которые мы хотим включить в наш пакет.
mv structure.py validate.py reader.py tableformat.py structly/
  1. Убедитесь, что все файлы были перемещены правильно. Мы можем использовать команду ls -l для вывода содержимого каталога structly.
ls -l structly/

Вы должны увидеть следующие файлы в списке:

__init__.py
reader.py
structure.py
tableformat.py
validate.py

Теперь мы создали базовую структуру пакета. Иерархия каталогов должна выглядеть следующим образом:

project/
├── portfolio.csv
├── stock.py
└── structly/
    ├── __init__.py
    ├── reader.py
    ├── structure.py
    ├── tableformat.py
    └── validate.py

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

Исправление операторов импорта

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

Файл structure.py очень важно обновить. Он импортирует функции и классы из файла validate.py. Поскольку оба эти файла теперь находятся в одном пакете structly, нам нужно соответствующим образом скорректировать оператор импорта.

Начнем с открытия файла structly/structure.py в редакторе. Вы можете либо щелкнуть по structly/structure.py в проводнике файлов, либо выполнить следующую команду в терминале:

## Щелкните по structly/structure.py в проводнике файлов или выполните:
code structly/structure.py

После открытия файла посмотрите на первую строку оператора импорта. В настоящее время она выглядит так:

from validate import validate_type

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

from .validate import validate_type

Точка (.) перед validate является здесь ключевой частью. Это специальный синтаксис в Python, называемый относительным импортом. Он указывает Python искать модуль validate в том же пакете, что и текущий модуль (в данном случае structure.py).

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

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

  1. structly/reader.py - Этот файл не импортирует из наших пользовательских модулей. Это означает, что нам не нужно вносить в него никаких изменений.
  2. structly/tableformat.py - Подобно файлу reader.py, этот файл также не импортирует из наших пользовательских модулей. Поэтому здесь также не требуется никаких изменений.
  3. structly/validate.py - Как и два предыдущих файла, он не импортирует из наших пользовательских модулей. Следовательно, нам не нужно его модифицировать.

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

Обновление и тестирование программы stock.py

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

Откройте файл stock.py в редакторе:

## Click on stock.py in the file explorer or run:
code stock.py

Текущие импорты в файле stock.py основаны на старой структуре, когда все файлы находились в одном каталоге. В Python, когда вы импортируете модуль, Python ищет этот модуль в определенных местах. В старой структуре, так как все файлы были в одном каталоге, Python мог легко найти модули. Но теперь, с новой структурой пакета, нам нужно обновить импорты, чтобы сообщить Python, где найти модули внутри пакета structly.

Обновите файл stock.py так, чтобы он выглядел точно так же:

## stock.py

from structly.structure import Structure, String, PositiveInteger, PositiveFloat

class Stock(Structure):
    name = String()
    shares = PositiveInteger()
    price = PositiveFloat()

    @property
    def cost(self):
        return self.shares * self.price

    def sell(self, nshares: PositiveInteger):
        self.shares -= nshares

if __name__ == '__main__':
    from structly.reader import read_csv_as_instances
    from structly.tableformat import create_formatter, print_table
    portfolio = read_csv_as_instances('portfolio.csv', Stock)
    formatter = create_formatter('text')
    print_table(portfolio, ['name','shares','price'], formatter)

Основные изменения:

  1. Изменено from structure import Structure, String, PositiveInteger, PositiveFloat на from structly.structure import Structure, String, PositiveInteger, PositiveFloat. Это изменение сообщает Python искать модуль structure внутри пакета structly.
  2. Изменено from reader import read_csv_as_instances на from structly.reader import read_csv_as_instances. Аналогично, это изменение направляет Python искать модуль reader внутри пакета structly.
  3. Изменено from tableformat import create_formatter, print_table на from structly.tableformat import create_formatter, print_table. Это гарантирует, что Python найдет модуль tableformat в пакете structly.

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

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

python stock.py

Вы должны увидеть следующий вывод:

      name      shares       price
---------- ---------- ----------
      MSFT        100      51.23
       IBM         50       91.1
      AAPL         75     145.89
      ACME        125     123.45
       HPE         75       32.2

Если вы видите такой вывод, поздравляем! Вы успешно создали пакет Python и обновили свой код для его использования. Это означает, что ваш код теперь организован более модульно, что облегчает его поддержку и расширение в будущем.

Резюме

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

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