На простых для понимания примерах!

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

  • Модули - это файлы с расширением «.py», содержащие код Python. Они помогают организовать связанные функции, классы или любой блок кода в одном файле.
  • Считается хорошей практикой разбивать большие блоки кода Python на модули, содержащие до 300–400 строк кода.
  • Пакеты группируют похожие модули в отдельный каталог. Это папки, содержащие связанные модули и файл __init__.py, который используется для необязательной инициализации на уровне пакета.
  • В зависимости от вашего приложения Python вы можете сгруппировать модули в подпакеты, такие как doc, core, utils, data, examples, test.

Давайте напишем пример кода Python3 для дальнейшего понимания модулей и пакетов:

""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file 
"""
import pandas as pd
print("cvs_get_module is loaded")
def display_file_location(path, file_name):
 print("File Location: {}".format(path+filename))
class CSVGetInfo:
 def __init__(self, path, file_name):
  self.path = path
  self.file_name = file_name
 
 def display_summary(self):
  data = pd.read_csv(self.path + self.file_name)
  print(self.file_name)
  print(data.info())

Импорт модулей

Чтобы использовать модуль во внешнем блоке кода Python, нам необходимо импортировать этот конкретный модуль в нашу структуру кода. Для этого используется оператор import с синтаксисом «import‹ имя_модуля». Имя модуля здесь относится к имени файла Python без расширения «.py». После импорта модуля мы используем точечную нотацию «.» для доступа к элементам внутри модуля.

# ModulesExample.py
# Importing 'csv_get_module' and accessing its elements
import csv_get_module
data_by_genres = csv_get_module.CSVGetInfo("/Users/erdemisbilen/
Lessons/", "data_by_genres.csv")
csv_get_module.display_file_location(data_by_genres.path, data_by_genres.file_name)
data_by_genres.display_summary()
Output:
cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):

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

Мы можем переименовать модуль во время импорта с синтаксисом ‘import‹ название_модуля ›как‹ альтернативное_имя ›’. Это может быть полезно для сокращения длинных имен модулей.

# ModulesExample.py
# Importing 'csv_get_module' and accessing its elements
import csv_get_module as cg
data_by_genres = cg.CSVGetInfo("/Users/erdemisbilen/Lessons/", "data_by_genres.csv")
cg.display_file_location(data_by_genres.path, data_by_genres.file_name)
data_by_genres.display_summary()
Output:
cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):

Импорт определенных имен из модуля

Мы можем импортировать определенные имена модуля, кроме загрузки всех элементов, содержащихся в модуле. Кроме того, мы можем импортировать несколько элементов, разделяя имена запятыми.

Обратите внимание, что здесь нам не нужно использовать точечную нотацию, поскольку мы напрямую импортируем имя с помощью 'from ‹имя_модуля› import ‹element_name›' синтаксис.

from csv_get_module import display_file_location as dfl
dfl("/User/Python/","ModulesExample.py")
Output:
File Location: /UserModulesExample.py

Импорт всех имен внутри модуля

Мы также можем напрямую импортировать все имена модуля, используя символ звездочки (*), хотя это не считается хорошей практикой. Это может вызвать конфликты имен, если вы импортируете несколько модулей, содержащих элементы с одинаковыми именами.

from csv_get_module import *

Скрытие элементов модуля

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

Отличие запуска автономного скрипта от загрузки модуля

Файл, содержащий коды Python, может быть запущен как отдельный скрипт или может быть загружен в другую структуру кода как модуль.

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

""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file 
"""
import pandas as pd
print("cvs_get_module is loaded")
def display_file_location(path, file_name):
 print("File Location: {}".format(path+filename))
class CSVGetInfo:
 def __init__(self, path, file_name):
  self.path = path
  self.file_name = file_name
 
 def display_summary(self):
  data = pd.read_csv(self.path + self.file_name)
  print(self.file_name)
  print(data.info())
if __name__ == '__main__':
 data_by_genres = CSVGetInfo("/Users/erdemisbilen/Lessons/", 
 "data_by_genres.csv")
 display_file_location(data_by_genres.path, 
 data_by_genres.file_name)
 data_by_genres.display_summary()

Коды внутри оператора if выше запускаются только тогда, когда сценарий выполняется как отдельный сценарий.

Пакеты в Python

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

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

В зависимости от вашего приложения Python вы можете подумать о том, чтобы сгруппировать свои модули в подпакеты, такие как doc, core, utils, data, examples, test. Это делает вашу общую структуру хорошо организованной и поддерживаемой, поскольку аналогичные модули хранятся в отдельных папках.

Импорт модулей из пакета

Мы можем импортировать модули внутри пакетов, используя имя пакета (имя папки) и оператор точки «.».

from utils.csv_get_module import display_file_location as dfl
dfl("/User/Python/","ModulesExample.py")
Output:
File Location: /UserModulesExample.py

Ключевые выводы

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

Заключение

В этом посте я объяснил основы модулей и пакетов в Python.

Код в этом посте доступен в моем репозитории GitHub.

Надеюсь, этот пост был вам полезен.

Спасибо за чтение!