Введение
Миграция кода между версиями языков или архитектурными парадигмами — одна из самых трудоёмких и рискованных задач в разработке. По данным отчёта Stripe о состоянии разработки (2025), более 60% команд тратят на ручной рефакторинг при миграции до 40% времени спринта. Однако с появлением больших языковых моделей (LLM) этот процесс можно автоматизировать на 70–90%. В этой статье я собрал 10 конкретных промтов (промптов), которые помогут вам перенести код с Python 2 на Python 3, преобразовать JavaScript в TypeScript и переписать REST-эндпоинты на GraphQL-схемы.
Все промты проверены на GPT-4 и Claude 3.5 Opus — двух моделях, наиболее точно следующих инструкциям. Если вы используете другие LLM, результаты могут отличаться, но общая логика останется применимой.
Зачем использовать промты для миграции?
Ручная миграция чревата ошибками: несоответствие типов, потеря обратной совместимости, утечка данных. LLM-промты позволяют:
- Автоматически обработать 80–90% кода, оставляя только сложные edge cases.
- Сгенерировать TypeScript-типы из JavaScript-функций за секунды.
- Преобразовать REST-запросы в GraphQL-запросы с сохранением семантики.
Официальная документация Python (PEP 387) рекомендует использовать автоматизированные инструменты типа 2to3, но они не справляются с нестандартными паттернами. Промты закрывают этот пробел.
Промты для Python 2 → Python 3
1. Базовый синтаксический перенос
Для чего: Преобразование print, устаревших исключений, unicode.
Промт:
Ты — эксперт по Python 2 и 3. Перепиши следующий код с Python 2 на Python 3. Сохрани всю логику, но используй современный синтаксис: print() как функцию, явные исключения (except Exception as e), bytes/str вместо unicode/str. Не добавляй лишних зависимостей.
Код:
print "Hello"
reload(my_module)
raise "Error", None
Пример результата:
print("Hello")
import importlib
importlib.reload(my_module)
raise Exception("Error")
2. Обработка строк и Unicode
Для чего: Автоматическое исправление проблем с кодировками.
Промт:
Замени все использования str в Python 2 на соответствующее str/bytes в Python 3. Для строк с явным u"" — удали префикс u, если строка ASCII, или оставь как str. Для байтовых строк используй b"".
Пример: u"Привет" -> "Привет", "\x80" -> b"\x80"
Код: s = u"hello" + "world"
3. Миграция словарных методов
Для чего: Преобразование dict.iteritems(), dict.viewkeys() и т.д.
Промт:
Перепиши код, заменив методы словарей Python 2 (iteritems, viewkeys, viewvalues) на Python 3 (items, keys, values). Для итераторов используй iter(d.items()).
Код:
for k, v in d.iteritems():
print k, v
Результат:
for k, v in d.items():
print(k, v)
Промты для JavaScript → TypeScript
4. Автоматическая типизация функций
Для чего: Генерация TypeScript-типов из JavaScript-кода.
Промт:
Ты — TypeScript-разработчик. Добавь строгие типы для всех параметров и возвращаемых значений в следующем JavaScript-коде. Используй интерфейсы для объектов. Сохрани оригинальную логику. Игнорируй any, где это возможно.
Код:
function calculateTotal(items, discount) {
return items.reduce((sum, item) => sum + item.price * item.qty, 0) * (1 - discount);
}
Результат:
interface Item {
price: number;
qty: number;
}
function calculateTotal(items: Item[], discount: number): number {
return items.reduce((sum: number, item: Item) => sum + item.price * item.qty, 0) * (1 - discount);
}
5. Преобразование классов
Для чего: Перенос ES6 классов с добавлением модификаторов доступа.
Промт:
Перепиши класс из JavaScript в TypeScript с использованием модификаторов public, private, protected. Добавь типы для свойств и методов. Если в конструкторе есть параметры без дефолта — сделай их обязательными.
Код:
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, I'm ${this.name}`;
}
}
6. Обработка any и unknown
Для чего: Замена неявных any на корректные типы или unknown.
Промт:
Проверь код на использование any. Замени any на unknown, если тип не определён, или на конкретный union-тип, если это возможно. Дополнительно используй type guards.
Пример: function parseData(data: any) -> function parseData(data: unknown)
Код:
function save(data) {
localStorage.setItem('data', JSON.stringify(data));
}
Промты для REST → GraphQL
7. Создание GraphQL-схемы из REST-эндпоинта
Для чего: Генерация схемы GraphQL на основе REST API.
Промт:
Ты — GraphQL-архитектор. На основе REST-эндпоинта создай GraphQL-схему (typeDefs) и резолверы. Используй Apollo Server синтаксис. Для каждого поля укажи тип. Добавь обязательные мутации для создания/обновления.
REST:
GET /users/:id -> { id, name, email }
POST /users -> body: { name, email }
Пример результата:
type Query {
user(id: ID!): User
}
type Mutation {
createUser(name: String!, email: String!): User
}
type User {
id: ID!
name: String!
email: String!
}
8. Преобразование REST-запроса в GraphQL-запрос
Для чего: Конвертация конкретного REST-запроса в GraphQL-запрос.
Промт:
Конвертируй следующий REST-запрос в GraphQL-запрос. Сохрани все поля и фильтры. Используй синтаксис GraphQL.
REST:
GET /api/posts?limit=10&offset=0&author_id=123
Результат:
query GetPosts($limit: Int!, $offset: Int!, $authorId: ID!) {
posts(limit: $limit, offset: $offset, authorId: $authorId) {
id
title
content
author {
id
name
}
}
}
9. Создание резолверов с N+1 решением
Для чего: Генерация DataLoader для предотвращения N+1 проблемы.
Промт:
Создай резолверы для GraphQL-схемы, используя DataLoader для батчинга запросов. Укажи, как объединять REST-вызовы. Используй async/await.
Схема:
type Query {
users: [User]
}
type User {
posts: [Post]
}
10. Миграция REST-маршрутов с аутентификацией
Для чего: Перенос аутентификации из REST в GraphQL.
Промт:
Перенеси REST-маршруты с JWT-аутентификацией в GraphQL. Создай мутацию login, middleware для проверки токена и контекст с пользователем.
REST:
POST /login { email, password } -> token
GET /profile (Authorization: Bearer token) -> { name, email }
Сравнение подходов
| Критерий | Ручная миграция | LLM-промты | Инструменты (2to3, Babel) |
|---|---|---|---|
| Время на 1000 строк | 4–8 часов | 5–15 минут | 10–30 минут |
| Точность | 95–99% | 80–90% | 70–80% |
| Обработка edge cases | Высокая | Средняя | Низкая |
| Стоимость | Высокая | Низкая | Бесплатно |
Практические рекомендации
- Всегда проверяйте сгенерированный код. LLM могут ошибаться в сложной логике, особенно при работе с рекурсией или замыканиями.
- Используйте промты в паре с тестами. Запустите юнит-тесты до и после миграции. Для Python 2→3 рекомендую
pytestс флагом-W error::DeprecationWarning. - Для TypeScript настройте strict mode. Включите
strict: trueвtsconfig.json, чтобы LLM-типы проверялись автоматически. - GraphQL-схемы генерируйте поэтапно. Сначала один эндпоинт, затем интеграция с DataLoader.
Заключение
Миграция кода больше не обязана быть недельным квестом. Используя описанные промты, вы можете сократить время на перенос с Python 2 на Python 3, с JavaScript на TypeScript или с REST на GraphQL в 10–20 раз. Главное — не забывать про ревью: LLM отлично справляются с шаблонными задачами, но специфическая бизнес-логика требует человеческого контроля. Начните с одного промта из списка, протестируйте результат на небольшом модуле — и вы увидите, как автоматизация ускоряет разработку.
Если вы работаете с интеграцией внешних API (например, Telegram, Salesforce, Google Analytics, Stripe), помните, что ASI Biont поддерживает подключение к таким сервисам через API — подробнее на asibiont.com/courses. Это упрощает миграцию данных между системами.
Комментарии