
Когда я только начинал писать на Python, думал: «Главное, чтобы работало». И действительно — скрипт парсит, бот отправляет, данные сохраняются. Но через неделю я сам не мог понять, что делает мой же код.
Потом я прочитал книгу «Чистый код» и начал применять простые правила — и всё изменилось. Теперь мой код:
- Читается как рассказ
- Легко модифицировать
- Понятен даже другим разработчикам
В этой статье — практические советы без воды: как структурировать код, называть переменные, избегать «лапши» и писать так, чтобы вам же было приятно возвращаться к скрипту через месяц.
Оглавление
1. Имена переменных и функций — говорите ясно
Плохо (загадка):
def calc(a, b):
return a * b - a
Хорошо (ясно):
def calculate_net_profit(revenue: float, expenses: float) -> float:
return revenue - expenses
✅ Правила:
- Используйте глаголы для функций:
send_notification,parse_data - Используйте существительные для переменных:
user_list,config_path - Избегайте однобуквенных имён (
i,x) — кроме цикловfor i in range(...)
2. Следуйте PEP8 — стандарту оформления Python
PEP8 — это стилевое руководство, принятое всем сообществом. Основные правила:
- Отступы — 4 пробела (не табы!)
- Максимум 79–88 символов в строке
- Между функциями — два пустых ряда
- Импорты — в начале файла, сгруппированы
Пример:
import os
import requests
def fetch_user_data(user_id: int) -> dict:
url = f"https://api.example.com/users/{user_id}"
response = requests.get(url)
return response.json()
📚 Прочитайте официальный документ: PEP8 для ознакомления.
Для автоматической проверки стиля используйте линтеры вроде flake8 или ruff. А если вы пишете скрипты для автоматизации — не забывайте и о читаемом форматировании вывода, как в статье python парсинг таблицы html , где данные выводятся в понятной табличной форме.
3. Используйте type hints — не угадывайте типы
С Python 3.5+ вы можете указывать типы:
def greet(name: str, age: int) -> str:
return f"Привет, {name}! Вам {age} лет."
✅ Преимущества:
- IDE подсказывает методы (
name.upper()) - Меньше ошибок вроде
"5" + 3 - Код самодокументирован
Для сложных типов:
from typing import List, Optional
def get_active_users(active_only: bool = True) -> List[dict]:
...
Если вы только начинаете работать с API или сложными структурами данных, type hints особенно полезны. Подробнее о работе с JSON и типами — в статье python api запрос: как получать и обрабатывать данные .
4. Замените % и .format() на f-строки
Устаревший способ:
name = "Анна"
print("Привет, {}!".format(name))
Современный и читаемый:
print(f"Привет, {name}!")
Можно даже вычислять:
price = 199
tax = 0.2
print(f"Итого: {price * (1 + tax):.2f} руб.")
5. Избегайте глубокой вложенности («стрелка ада»)
Плохо:
def process_data(data):
if data:
if len(data) > 0:
for item in data:
if item.is_valid():
if not item.archived:
# ... основная логика
Хорошо — используйте ранний выход:
def process_data(data):
if not data:
return
for item in data:
if not item.is_valid() or item.archived:
continue
# основная логика
Или выносите проверки в отдельные функции:
def should_process(item) -> bool:
return item.is_valid() and not item.archived
6. Разбивайте код на функции по принципу «одна задача — одна функция»
Плохо — монолит:
def main():
url = "https://api..."
resp = requests.get(url)
data = resp.json()
with open("output.csv", "w") as f:
writer = csv.writer(f)
for d in data:
writer.writerow([d["name"], d["email"]])
send_email("Готово!")
Хорошо — модульно:
def fetch_data(url: str) -> List[dict]:
return requests.get(url).json()
def save_to_csv(data: List[dict], path: str):
with open(path, "w") as f:
writer = csv.writer(f)
for d in data:
writer.writerow([d["name"], d["email"]])
def main():
data = fetch_data("https://api...")
save_to_csv(data, "output.csv")
send_email("Готово!")
✅ Плюсы:
- Можно тестировать каждую функцию отдельно
- Легко заменить CSV на JSON — не трогая остальное
Такой подход позволяет легко интегрировать уведомления. Например, отправку отчёта на email можно реализовать через скрипт из статьи Python-скрипт: отправка ежедневного отчёта на email автоматически.
7. Документируйте только то, что неочевидно
Не пишите:
# Получаем имя пользователя
name = user.get_name()
Пишите, если есть нюанс:
# Имя возвращается в формате "Фамилия Имя", разделяем вручную
first_name = full_name.split()[1]
Для публичных функций — используйте docstring:
def parse_date(date_str: str) -> datetime:
"""
Парсит дату в формате 'YYYY-MM-DD'.
Выбрасывает ValueError, если формат неверный.
"""
return datetime.strptime(date_str, "%Y-%m-%d")
Заключение
Чистый код — это не про «красиво», а про уважение к себе и другим.
Когда вы следуете этим практикам:
- Тратите меньше времени на отладку
- Легко возвращаетесь к старым проектам
- Ваш код принимают в open-source
- Коллеги хвалят вас за профессионализм
🐍 Начните с одного правила сегодня — и через месяц вы не узнаете свой стиль.
• python api запрос — безопасная работа с JSON и type hints
• python отправить письмо gmail — автоматические отчёты с читаемым кодом
• python github api — примеры с правильной структурой и обработкой ошибок
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!