Создание собственных модулей и повторное использование кода

Почему модули — это суперсила 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(): ...
Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty