Создание собственных модулей и повторное использование кода
Почему модули — это суперсила Python? 🦸
В Python модуль — это просто файл с расширением .py, содержащий код. Но за этой простотой скрывается мощь! Представьте:
# Без модулей (кошмар!)
def calculate_tax(income):
return income * 0.2
def format_currency(amount):
return f"${amount:.2f}"
# Копипаста этого кода в 15 других файлов... О нет!
# С модулями (вау!)
from finance_utils import calculate_tax, format_currency
Фишка в том, что модули позволяют: - Организовать код логически - Избежать дублирования - Обновлять функционал в одном месте
Создаём свой первый модуль 🛠️
1. Создайте файл greetings.py:
# greetings.py
def say_hello(name):
return f"Привет, {name}! 👋"
def say_goodbye(name):
return f"Пока, {name}! ✌️"
2. Теперь используем его в другом файле:
# main.py
import greetings
print(greetings.say_hello("Данила")) # Привет, Данила! 👋
print(greetings.say_goodbye("Анна")) # Пока, Анна! ✌️
Профессиональный лайфхак: Импортируйте только нужные функции:
from greetings import say_hello
print(say_hello("Мир")) # Код чище!
Импорт с пользой: 3 продвинутых способа
1. Псевдонимы для модулей
Когда названия длинные:
import pandas as pd # Классика!
import matplotlib.pyplot as plt
2. Импорт всего содержимого (осторожно!)
from math import * # Все функции math теперь доступны напрямую
print(sqrt(16)) # 4.0
Важно: Может привести к конфликтам имен!
3. Относительный импорт в пакетах
Для сложных проектов с подпакетами:
my_package/
__init__.py
utils/
__init__.py
helpers.py
main.py
В main.py:
from .utils.helpers import clean_data # Точка указывает на текущий пакет
Секретный раздел: __init__.py и пакеты 📦
__init__.py превращает папку в Python-пакет. Это как VIP-пропуск для вашего кода!
Пример структуры:
ecommerce/
__init__.py
cart.py
products.py
payment/
__init__.py
processors.py
Магия __init__.py:
# ecommerce/__init__.py
from .cart import Cart # Теперь можно: from ecommerce import Cart
Как это использовать:
from ecommerce import Cart
from ecommerce.payment.processors import process_payment
Практика: создаём полезный модуль 🚀
Давайте сделаем модуль для работы с CSV:
1. Создаем csv_utils.py:
import csv
def read_csv(filepath):
"""Читает CSV и возвращает список словарей."""
with open(filepath, mode='r', encoding='utf-8') as file:
return list(csv.DictReader(file))
def write_csv(filepath, data, headers):
"""Записывает данные в CSV."""
with open(filepath, mode='w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(file, fieldnames=headers)
writer.writeheader()
writer.writerows(data)
2. Используем в проекте:
from csv_utils import read_csv
data = read_csv('employees.csv')
for employee in data:
print(employee['name'], employee['position'])
Бонус: Добавьте обработку ошибок и валидацию данных!
Продвинутые техники: что ещё можно сделать?
1. Динамический импорт:
module_name = "json"
json_module = __import__(module_name)
2. Режим отладки:
if __name__ == "__main__":
print("Этот код выполнится только при прямом запуске модуля!")
3. Документируем модуль:
"""
Модуль для работы с финансами
Функции:
calculate_tax(income): Рассчитывает налог
format_currency(amount): Форматирует сумму
"""
Главное правило модульности 💎
Как говорит Данила Бежин:
"Модуль должен решать одну задачу, но делать это блестяще!"
Пример плохого модуля:
# bad_module.py
def send_email(): ...
def calculate_stats(): ...
def draw_chart(): ...
Хороший модуль:
# email_service.py
def send(): ...
def validate(): ...
def format(): ...