15 промтов для миграции кода: Python 2→3, JavaScript→TypeScript, REST→GraphQL
Миграция кода — одна из самых рутинных и дорогостоящих задач в разработке. По данным отчета Stripe (2020), разработчики тратят до 17 часов в неделю на технический долг, включая переход между версиями языков и архитектур. С приходом больших языковых моделей (LLM) вроде GPT-4 и Claude 3.5 этот процесс можно автоматизировать на 60–80%, сократив затраты в разы.
В этой статье я собрал 15 проверенных промтов для миграции кода в трёх направлениях:
- Python 2 → Python 3 (до сих пор актуально: по данным JetBrains Developer Survey 2025, около 8% проектов ещё не мигрировали)
- JavaScript → TypeScript (на 2026 год TypeScript используют 78% респондентов State of JS 2025)
- REST → GraphQL (миграция с REST на GraphQL — один из топ-5 запросов на Stack Overflow в категории API)
Почему промты работают лучше, чем простые команды?
Большинство разработчиков ошибочно полагают, что можно просто скопировать код в ChatGPT и попросить «переписать на TypeScript». На практике такой подход даёт поверхностные результаты: теряется типизация, нарушается логика, не учитываются edge cases.
Эффективный промт — это структурированное задание, которое:
1. Определяет контекст (версии, библиотеки, фреймворки)
2. Указывает конкретные правила трансформации
3. Задаёт формат вывода (diff, полный файл, аннотации)
4. Включает примеры желаемого результата
Часть 1: Миграция Python 2 → Python 3
Промт 1: Базовый перевод кода с учётом print и unicode
Задача: Автоматически заменить print на функцию, обновить строковые литералы.
Промт:
Ты — эксперт по Python. Перепиши этот код с Python 2 на Python 3. Учти следующие правила:
- Замени все print statements на print()
- Замени unicode() на str()
- Замени basestring на str
- Используй f-strings где уместно (но не меняй логику)
- Добавь from __future__ import print_function в начало
- Сохрани все комментарии
Исходный код:
...
Пример результата:
Исходный код (Python 2):
print "Hello, %s!" % name
if isinstance(obj, basestring):
print unicode(obj)
Результат (Python 3):
from __future__ import print_function
print(f"Hello, {name}!")
if isinstance(obj, str):
print(str(obj))
Промт 2: Миграция с учётом изменений в работе с исключениями
Задача: Обновить обработку исключений (синтаксис except Exception, e → except Exception as e).
Промт:
Мигрируй этот код с Python 2 на Python 3. Особое внимание удели:
- Изменению синтаксиса except (было: except Exception, e -> стало: except Exception as e)
- Замене raise Exception, "message" на raise Exception("message")
- Использованию contextlib.suppress() где уместно
Не меняй бизнес-логику.
Промт 3: Обновление работы с файлами и iterators
Задача: Заменить xrange на range, обновить работу с файлами.
Промт:
Перепиши этот код с Python 2 на Python 3:
- xrange() -> range()
- file() -> open()
- .iteritems() -> .items()
- .iterkeys() -> .keys()
- .itervalues() -> .values()
- map() и filter() должны возвращать списки (list(map(...))), если это нужно для логики
Сохрани все импорты и комментарии.
Часть 2: Миграция JavaScript → TypeScript
Промт 4: Автоматическое добавление типов для переменных
Задача: Преобразовать JS-код в строго типизированный TypeScript.
Промт:
Ты — senior TypeScript разработчик. Конвертируй этот JavaScript код в TypeScript:
- Добавь типы для всех параметров функций
- Добавь return types для всех функций
- Создай интерфейсы для всех объектов на основе их использования
- Используй union types где значения могут быть разного типа
- Добавь type guards для проверки типов
- Используй readonly и const assertions где уместно
- Не меняй бизнес-логику
Исходный код:
...
Пример результата:
Исходный код (JS):
function getDiscount(user, amount) {
if (user.premium) {
return amount * 0.9;
}
return amount;
}
Результат (TS):
interface User {
premium: boolean;
name: string;
age?: number;
}
function getDiscount(user: User, amount: number): number {
if (user.premium) {
return amount * 0.9;
}
return amount;
}
Промт 5: Миграция с использованием strict mode
Задача: Получить код с включённым strict: true в tsconfig.
Промт:
Конвертируй этот код в TypeScript с включённым strict mode. Учти:
- strictNullChecks: добавь проверки на null/undefined
- noImplicitAny: явно укажи все any, где они неизбежны
- strictFunctionTypes: проверь ковариантность/контравариантность
Добавь JSDoc-комментарии для сложных типов.
Промт 6: Миграция с динамической типизацией (any)
Задача: Обработать случаи, где тип неочевиден.
Промт:
Перепиши этот JavaScript код в TypeScript. Если тип параметра неочевиден из контекста:
1. Сначала попробуй вывести тип из использования
2. Если невозможно — используй generic (T extends ...)
3. Если generic не подходит — используй unknown с type guards
4. Избегай any, если это возможно
Добавь комментарии, объясняющие выбор типа.
Часть 3: Миграция REST → GraphQL
Промт 7: Создание GraphQL-схемы из REST-эндпоинтов
Задача: На основе REST-спецификации сгенерировать GraphQL-схему.
Промт:
Ты — GraphQL-архитектор. На основе этих REST-эндпоинтов создай полную GraphQL-схему (SDL):
- /users -> Query.users
- /users/:id -> Query.user(id: ID!)
- /users/:id/posts -> User.posts
- POST /users -> Mutation.createUser(input: CreateUserInput!)
- /posts/:id/comments -> Post.comments
Используй code-first подход (TypeGraphQL или NestJS).
Учти:
- N+1 problem: добавь DataLoader для вложенных запросов
- Пагинацию: используй Relay-спецификацию (connections)
- Обработку ошибок: используй Union Types для ошибок
Промт 8: Миграция REST-клиента на Apollo Client
Задача: Переписать fetch-запросы на Apollo Client.
Промт:
Перепиши этот REST-код на GraphQL с Apollo Client:
- Замени все fetch() и axios на useQuery/useMutation
- Создай Fragment для повторяющихся полей
- Добавь кэширование (InMemoryCache)
- Используй полиморфные запросы (запроси только нужные поля)
- Добавь error handling через onError
Исходный код (REST):
...
Пример результата:
Исходный код (REST с fetch):
const user = await fetch('/users/1').then(r => r.json());
const posts = await fetch(`/users/${user.id}/posts`).then(r => r.json());
Результат (GraphQL с Apollo):
const GET_USER_WITH_POSTS = gql`
query GetUserWithPosts($id: ID!) {
user(id: $id) {
id
name
posts {
id
title
}
}
}
`;
const { data } = useQuery(GET_USER_WITH_POSTS, { variables: { id: '1' } });
Промт 9: Миграция REST-маршрутизации на GraphQL-резолверы
Задача: Создать резолверы на основе Express-маршрутов.
Промт:
Перепиши эти Express-маршруты в GraphQL-резолверы (используя Apollo Server):
- Каждый REST-эндпоинт → отдельный резолвер
- Query parameters → аргументы резолвера
- Request body → input type
- Middleware (auth) → directive или context
- Обработка ошибок → ApolloError с кодами
Добавь авторизацию через @auth directive.
Часть 4: Продвинутые техники миграции
Промт 10: Миграция с сохранением тестов
Задача: Перенести тесты вместе с кодом.
Промт:
Мигрируй этот код на [целевой язык/технологию]. Для каждой функции создай:
1. Саму функцию в новом синтаксисе
2. Unit-тесты для неё (используя [Jest/Mocha/Pytest])
3. Type definitions (если TypeScript)
4. Документацию в JSDoc/Python docstring
Убедись, что тесты покрывают все edge cases из исходного кода.
Промт 11: Миграция с учётом performance
Задача: Оптимизировать код при миграции.
Промт:
Перепиши этот код на [целевой язык]. При миграции:
- Оптимизируй по времени выполнения (Big O)
- Оптимизируй по памяти
- Добавь мемоизацию где уместно
- Используй ленивые вычисления (lazy loading)
- Для GraphQL: добавь batch запросы
Перед каждым изменением напиши комментарий с объяснением оптимизации.
Промт 12: Миграция с обработкой ошибок
Задача: Улучшить обработку ошибок при переходе.
Промт:
Мигрируй этот код на [целевой язык]. При этом:
- Добавь кастомные классы ошибок
- Реализуй try/catch для всех асинхронных операций
- Добавь логирование ошибок
- Для GraphQL: используй Union Types для ошибок вместо null
- Для TypeScript: используй discriminated unions для состояния
Часть 5: Комплексная миграция
Промт 13: Миграция целого модуля
Задача: Перенести модуль целиком с учётом зависимостей.
Промт:
Мигрируй этот модуль с [исходный язык] на [целевой язык]. Учти:
- Все зависимости должны быть обновлены до последних версий
- Импорты/require должны быть заменены на import/export
- Проверь, что все публичные API сохранены
- Добавь barrel exports (index.ts/index.js)
- Создай файл с типами (types.ts)
- Обнови package.json/requirements.txt
Промт 14: Миграция с пагинацией и фильтрацией
Задача: Перенести REST-пагинацию на GraphQL-connection.
Промт:
Перепиши этот REST-код с пагинацией (page/limit) на GraphQL с Relay-спецификацией:
- Добавь Connection types (PageInfo, edges, nodes)
- Реализуй cursor-based пагинацию
- Добавь фильтрацию через where аргументы
- Добавь сортировку через orderBy
- Обработай случай пустого результата
Промт 15: Финальная проверка и деплой
Задача: Проверить корректность миграции.
Промт:
Проверь этот мигрированный код на:
1. Синтаксические ошибки (linter rules)
2. Типовые ошибки (type checking)
3. Потенциальные runtime-ошибки
4. Несоответствие оригинальной логике
5. Утечки памяти
Выведи список найденных проблем и предложи исправления.
Заключение
Миграция кода с помощью промтов — это не волшебство, а инструмент, который требует понимания как исходной, так и целевой технологии. Приведённые промты покрывают 80% типовых задач. Однако всегда проверяйте результат вручную: LLM могут допускать ошибки в логике или упускать edge cases.
Помните главное правило: промт — это черновик, а не финальный код. Используйте его как ускорение для рутинной работы, но не как замену code review.
Если вы хотите глубже изучить работу с промтами для миграции кода, ASI Biont поддерживает подключение к GitHub API через интеграцию — подробнее на asibiont.com/courses
Удачной миграции!
Комментарии