Вам интересно, как вы можете написать свой собственный пользовательский модуль на Python, подобный известным библиотекам Python, таким как NumPy или Pandas?
В этой статье мы исследуем, что такое пользовательский модуль Python и как написать модуль на Python. Давайте пожалуй приступим к разбору.
Что такое пользовательский модуль в Python?
Модуль - это программный файл Python, состоящий из определений или кода, которые вы можете использовать в других программных файлах Python. Это .py файлы, написанные на Python.
Вы можете написать модуль Python самостоятельно. Они могут содержать определения функций, классов и переменных, которые могут использоваться в других программах на Python.
Зачем писать пользовательский модуль на Python?
Написание пользовательских модулей на Python полезно для разбиения больших частей программы на более мелкие, более управляемые и организованные файлы. Это также повышает возможность повторного использования кода и является отличным применением принципа DRY (Don’t Repeat Yourself).
Например, вместо того, чтобы копировать и вставлять функции, которые мы используем, в разные программы снова и снова, мы можем хранить их в пользовательском модуле Python и импортировать по мере необходимости.
Как написать пользовательский модуль на Python
Давайте рассмотрим краткий пример, написав модуль с именем circle_area. Он сохраняется как circle_area.py и содержит функцию для вычисления площади окружности:
# circle_area.py
# Определяем функцию
def area_of_circle(r):
pi = 3.14
area = pi * (r * r)
return area
Затем мы открываем другой файл под названием main.py в котором мы запускаем нашу функцию, вот так:
# main.py
# Импортируем модуль circle_area
import circle_area
# Вызываем функцию
print("Area of circle = %.6f" % circle_area.area_of_circle(7))
Поскольку мы ссылаемся на модуль, нам нужно вызвать функцию, сославшись на имя модуля в точечной нотации.
Когда мы запускаем main.py скрипт в консоли, мы получаем следующий вывод:
Area of circle = 153.860000
В приведенном выше примере мы импортировали весь модуль целиком. В качестве альтернативы, мы могли бы импортировать только функции, необходимые для нашей программы. В этом случае мы бы импортировали только area_of_circle() метод как:
from circle_area import area_of_circle
Мы также можем импортировать модуль, переименовав его:
import circle_area as ca
Это может сэкономить время набора текста. Сокращения часто становятся стандартной практикой в отрасли; например, NumPy библиотека часто импортируется как np.
Мы также можем импортировать все определения из модуля с символом звездочки (*), например:
from circle_area import *
Однако это не очень хорошая практика программирования, поскольку это может привести к дублированию определений и сделать код менее читаемым.
Мы также можем определять переменные внутри модуля и вызывать их из нашего основного скрипта. Например, я обновил предыдущий circle_area.py модуль путем добавления переменной с именем coolpy:
# circle_area.py
# Определяем функцию
def area_of_circle(r):
pi = 3.14
area = pi * (r * r)
return area
# Определяем переменную
coolpy = "https://dzen.ru/kalinkin is cool!"
Затем мы печатаем его из нашего main.py файл:
# Импортируйте модуль circle_area
import circle_area
# Вызовите функцию
print("Area of circle = %.6f" % circle_area.area_of_circle(7))
# Выведите переменную
print(circle_area.coolpy)
Это даст нам следующий результат:
Area of circle = 153.860000
https://dzen.ru/kalinkin is cool!
Опираясь на статью о том, как написать пользовательский класс на Python, мы также можем добавлять классы в наш пользовательский модуль Python. Для наглядности я создал новый модуль, сохраненный как pypok.py, который содержит Pokemon класс, который я использовал ранее:
# pypok.py
# Определите класс
class Pokemon:
def __init__(self, power, level, names):
self.power = power
self.level = level
self.names = names
def __repr__(self):
return (f'Pokemon({self.power}, '
f'{self.level}, '
f'{self.names})')
def total_damage(self):
return self.damage(self.power, self.level)
@staticmethod
def damage(power, level):
return (power * level * 2) / 50
Теперь мы добавим класс в main.py. Чтобы скрипт запускался без ошибок, мне нужно импортировать мой новый pypok модуль.
# main.py
# Импортируйте модули circle_area и pypok
import circle_area
import pypok
# Вызовите функцию
print("Area of circle = %.6f" % circle_area.area_of_circle(7))
# Выведите переменную
print(circle_area.coolpy)
# Вызовите класс
squirtle = pypok.Pokemon(20, 8, "Squirtle")
print("Squirtle inflicts", squirtle.total_damage(), "points of damage!")
Запускаем наш main.py скрипт возвращает следующий вывод:
Area of circle = 153.860000
https://dzen.ru/kalinkin is cool!
Squirtle inflicts 6.4 points of damage!
Как только мы вызовем пользовательский класс, определенный ранее, мы сможем получить доступ к функциям и атрибутам класса в main.py пространство имен файла.
Хотя мы можем писать пользовательские модули для определения функций, мы также можем писать их для реализации кода.
# circle_area.py
# Определите функцию
def area_of_circle(r):
pi = 3.14
area = pi * (r * r)
return area
# Вызовите функцию внутри модуля
print(area_of_circle(7))
Мы обновляем main.py скрипт, удалив все, кроме строки импорта модуля:
# main.py
# Импортируйте модуль circle_area
import circle_area
Теперь мы можем запустить скрипт и получить следующий результат:
153.86
Как вы можете видеть, одна строка импорта в нашем main.py для получения выходных данных достаточно файла. Хотя это действительно работает, вам следует избегать подобных решений. Импорт не должен делать ничего большего, чем сообщать Python о новых объектах. В конце концов, вы же не хотите выполнять сложные вычисления до того, как они понадобятся.
Лучше сохранить модули как можно более общими, чтобы сделать их многоразовыми и избежать повторений. Переменные, относящиеся к конкретному проекту, должны храниться в общем файле, например main.py.
Пишите пользовательские модули на Python!
Я надеюсь, что эта статья дала вам хорошее представление о том, как написать модуль на Python. Не стесняйтесь поиграть с приведенными выше фрагментами и написать свои собственные модули.
Кроме того, я призываю вас поразмыслить над своей практикой программирования. Какие функции или классы вы часто используете? Хорошей практикой может быть хранение их в вашем пользовательском модуле Python, чтобы сэкономить время и сделать ваш код более читаемым и простым в обслуживании.