Python + LLM: 12 промтов, которые превращают рутину в автоматизацию
За последние два года я перепробовал десятки подходов к использованию больших языковых моделей в разработке на Python. И знаете что? Большинство «волшебных» промтов из интернета не работают в реальных проектах — они либо слишком общие, либо выдают код, который приходится переписывать с нуля. Но есть и те, что экономят часы работы ежедневно. В этой подборке — 12 проверенных промтов, которые я использую сам и рекомендую коллегам: от генерации кода до рефакторинга, тестирования и оптимизации. Каждый промт сопровождается примером и пояснением, для каких задач он подходит.
Важно: все примеры предполагают, что вы используете LLM с доступом к контексту проекта (например, через API или в IDE). Если модель не видит ваш код, добавьте в промт соответствующие фрагменты. И помните: AI — это инструмент, а не замена инженерному мышлению. Всегда проверяйте сгенерированный код, особенно если он касается безопасности или работы с данными.
1. Генерация кода по описанию
Задача: быстро создать функцию или класс по текстовому описанию, когда лень писать шаблонный код.
Промт:
Ты — опытный Python-разработчик. Напиши функцию на Python, которая принимает список словарей и возвращает новый список, где каждый словарь содержит только ключи из заданного набора. Используй аннотации типов и docstring в стиле Google. Добавь обработку исключений для неверных типов.
Пример результата:
from typing import List, Dict, Any, Set
def filter_keys(data: List[Dict[str, Any]], allowed_keys: Set[str]) -> List[Dict[str, Any]]:
"""Фильтрует список словарей, оставляя только указанные ключи.
Args:
data: Исходный список словарей.
allowed_keys: Множество ключей, которые нужно оставить.
Returns:
Новый список словарей с отфильтрованными ключами.
Raises:
TypeError: Если data не список или allowed_keys не множество.
"""
if not isinstance(data, list):
raise TypeError("data должен быть списком")
if not isinstance(allowed_keys, set):
raise TypeError("allowed_keys должен быть множеством")
return [{k: v for k, v in item.items() if k in allowed_keys} for item in data]
Когда использовать: для быстрого прототипирования, создания утилитарных функций, boilerplate-кода. Экономит время на написание рутинных операций.
2. Рефакторинг с сохранением поведения
Задача: улучшить читаемость или производительность кода, не меняя его логику.
Промт:
Проведи рефакторинг следующего кода. Цель: улучшить читаемость и убрать дублирование, но сохранить поведение. Используй list comprehensions и встроенные функции, где это уместно. Не меняй сигнатуру функции.
```python
# исходный код
**Пример результата:**
Исходный код:
```python
def process(items):
result = []
for i in items:
if i > 0:
result.append(i * 2)
return result
После рефакторинга:
def process(items: list[int]) -> list[int]:
return [i * 2 for i in items if i > 0]
Когда использовать: для улучшения legacy-кода, при code review, для приведения кода к стандартам PEP 8.
3. Написание тестов (pytest)
Задача: сгенерировать unit-тесты для существующей функции.
Промт:
Напиши тесты на pytest для следующей функции. Покрой крайние случаи: пустой список, отрицательные числа, None. Используй параметризацию. Добавь проверку исключений.
```python
# функция
**Пример результата:**
```python
import pytest
from mymodule import process
@pytest.mark.parametrize("input_data, expected", [
([1, 2, 3], [2, 4, 6]),
([-1, 0, 1], [2]),
([], []),
])
def test_process_positive(input_data, expected):
assert process(input_data) == expected
def test_process_invalid_type():
with pytest.raises(TypeError):
process(None)
Когда использовать: для быстрого создания тестового покрытия, особенно при рефакторинге или добавлении новой функциональности.
4. Отладка и анализ ошибок
Задача: понять причину ошибки и получить建议 по исправлению.
Промт:
Я получил следующую ошибку при выполнении Python-кода:
Traceback (most recent call last):
File "example.py", line 10, in
main()
File "example.py", line 7, in main
result = 10 / 0
ZeroDivisionError: division by zero
Вот соответствующий код:
```python
def main():
x = 0
return 10 / x
Объясни причину и предложи исправление. Учти, что x может быть равен нулю.
**Пример результата:**
Причина: деление на ноль. Исправление: добавить проверку или использовать обработку исключений.
```python
def main():
x = 0
if x == 0:
return None # или raise ValueError("x не может быть нулём")
return 10 / x
Когда использовать: при отладке сложных ошибок, особенно если traceback большой.
5. Оптимизация производительности
Задача: ускорить медленный участок кода.
Промт:
Проанализируй следующий код на Python и предложи оптимизации для повышения производительности. Особое внимание удели циклам и работе с памятью. Предложи альтернативные реализации с использованием numpy или встроенных функций.
```python
# код
**Пример результата:**
Исходный код:
```python
def sum_squares(n):
total = 0
for i in range(n):
total += i * i
return total
Оптимизированный вариант:
def sum_squares(n: int) -> int:
return sum(i * i for i in range(n))
# или с numpy:
import numpy as np
def sum_squares_np(n: int) -> int:
return np.sum(np.arange(n) ** 2)
Когда использовать: при работе с большими данными, в циклах, в задачах машинного обучения.
6. Работа с FastAPI: создание эндпоинта
Задача: сгенерировать код эндпоинта с валидацией и документацией.
Промт:
Создай эндпоинт FastAPI для получения списка пользователей с пагинацией. Используй Pydantic-модели для валидации. Добавь обработку ошибок и автоматическую документацию.
Пример результата:
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
from typing import List
app = FastAPI()
class User(BaseModel):
id: int
name: str
email: str
users_db = [{"id": i, "name": f"User{i}", "email": f"user{i}@example.com"} for i in range(100)]
@app.get("/users/", response_model=List[User])
def get_users(skip: int = Query(0, ge=0), limit: int = Query(10, le=100)):
return users_db[skip: skip + limit]
Когда использовать: при разработке REST API на FastAPI, для быстрого создания CRUD-операций.
7. SQL-запросы через ORM (SQLAlchemy)
Задача: сгенерировать сложный запрос с джойнами и фильтрацией.
Промт:
Напиши SQLAlchemy запрос для получения списка заказов с информацией о пользователе, отфильтрованных по статусу 'completed' и дате за последний месяц. Используй join и order_by.
Пример результата:
from sqlalchemy import select
from datetime import datetime, timedelta
one_month_ago = datetime.now() - timedelta(days=30)
stmt = (
select(Order, User)
.join(User, Order.user_id == User.id)
.where(Order.status == 'completed', Order.created_at >= one_month_ago)
.order_by(Order.created_at.desc())
)
results = session.execute(stmt).all()
Когда использовать: при работе с базами данных через SQLAlchemy, для генерации сложных запросов.
8. Документирование кода
Задача: автоматически сгенерировать docstring и комментарии.
Промт:
Добавь docstring в стиле Google к следующей функции, а также inline-комментарии для сложных участков. Объясни, что делает каждый параметр и что возвращает функция.
```python
# код
**Пример результата:**
```python
def calculate_discount(price: float, discount_percent: float) -> float:
"""Вычисляет цену со скидкой.
Args:
price: Исходная цена товара.
discount_percent: Размер скидки в процентах (0-100).
Returns:
Цена после применения скидки.
Raises:
ValueError: Если discount_percent вне диапазона [0, 100].
"""
if not 0 <= discount_percent <= 100:
raise ValueError("Скидка должна быть от 0 до 100")
return price * (1 - discount_percent / 100)
Когда использовать: при написании библиотек, API, для улучшения читаемости кода.
9. Конвертация кода между версиями Python
Задача: обновить код с Python 2 на Python 3 или с 3.8 на 3.12.
Промт:
Перепиши следующий код с Python 2 на Python 3. Учти изменения в синтаксисе print, делении, работе со строками и исключениями.
```python
# код на Python 2
**Пример результата:**
Исходный код (Python 2):
```python
print "Hello"
result = 5 / 2
except Exception, e:
pass
После конвертации:
print("Hello")
result = 5 / 2 # в Python 3 это 2.5
except Exception as e:
pass
Когда использовать: при миграции legacy-проектов на новые версии Python.
10. Генерация регулярных выражений
Задача: создать regex для сложного шаблона.
Промт:
Напиши регулярное выражение на Python для поиска email-адресов в тексте. Объясни каждую часть паттерна. Приведи пример использования с re.findall.
Пример результата:
import re
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
text = "Контакты: test@example.com, support@company.ru"
emails = re.findall(pattern, text)
print(emails) # ['test@example.com', 'support@company.ru']
Когда использовать: для парсинга текста, валидации данных, обработки логов.
11. Асинхронный код (asyncio)
Задача: преобразовать синхронный код в асинхронный.
Промт:
Перепиши следующую функцию так, чтобы она работала асинхронно с использованием asyncio. Добавь обработку таймаутов и ошибок.
```python
# синхронный код
**Пример результата:**
Исходный код:
```python
import requests
def fetch(url):
return requests.get(url).text
Асинхронный вариант:
import aiohttp
import asyncio
async def fetch(url: str) -> str:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
Когда использовать: при работе с сетевыми запросами, в высоконагруженных приложениях.
12. Генерация mock-данных для тестов
Задача: создать реалистичные тестовые данные.
Промт:
Сгенерируй 100 записей пользователей в формате JSON с полями: id, name, email, age, created_at. Используй библиотеку Faker для реалистичности. Напиши скрипт на Python.
Пример результата:
from faker import Faker
import json
from datetime import datetime
fake = Faker()
users = []
for i in range(100):
users.append({
"id": i + 1,
"name": fake.name(),
"email": fake.email(),
"age": fake.random_int(min=18, max=80),
"created_at": fake.iso8601(),
})
with open("users.json", "w") as f:
json.dump(users, f, indent=2)
Когда использовать: для наполнения тестовой базы, демо-стендов, нагрузочного тестирования.
Заключение
Эти 12 промтов покрывают большинство ежедневных задач Python-разработчика: от написания кода до его оптимизации и тестирования. Главное правило — не слепо копировать сгенерированное, а адаптировать под свой проект. LLM не заменяет инженера, но становится мощным ускорителем, если использовать его системно. Попробуйте внедрить хотя бы 2–3 промта в свою работу, и вы заметите, как освобождается время для более творческих задач. А если у вас есть свои любимые промты — делитесь в комментариях.
Источники для углубления:
- Документация Python: https://docs.python.org/3/
- FastAPI: https://fastapi.tiangolo.com/
- SQLAlchemy: https://docs.sqlalchemy.org/
- pytest: https://docs.pytest.org/
- asyncio: https://docs.python.org/3/library/asyncio.html
Комментарии