View
1.252
Download
2
Category
Preview:
Citation preview
Автоматизируем рефакторинги: AST, FST и все-все-всеКирилл Борисов PyCon Russia 2015, 18-19 сентября 2015
Поддержка старого кода
Уменьшение “копипасты”
Исправление ошибок
Повышение читаемости
4
Рефакторинг? Зачем?
Совершенно согласен, отличный инструмент!
Идеален для интерактивного рефакторинга
Нет возможностей для массовой обработки
Слишком простые инструменты
Не все пользуются PyCharm
5
«Почему не PyCharm?»
Отличное решение!
Но подходит только в простых случаях:
• Малое количество файлов
• Небольшие объемы кода (< 5 тысяч срок)
• Вносимые изменения элементарны или интуитивны
6
«Я руками быстрее справлюсь!»
Файлов с исходным кодом: 1124
Строчек кода: 253 473 (~ 75% - тесты)
Тестов: 10 991
Общий объем: 220 мегабайт
7
Наши цифры: Яндекс.Паспорт
Автоматизируйте это!
Наличие тестов или тестировщиков
Есть представление о нужном результате
Изменения потенциально стоят затраченного времени
Легкое безумие :)
9
Необходимые условия
1. Преобразуем исходный код в удобную структуру
2. Пропускаем структуру через фильтр
3. Оцениваем контекст
4. Вносим изменения
5. Выгружаем обратно исходный код
10
Методика внесения изменений
“Батарейки”
tokenize - разбиение исходника на токены
12
Стандартная библиотека Python
13
tokenize: из текста в токены
tokenize - разбиение исходника на токены ast - построение синтаксического дерева
14
Стандартная библиотека Python
15
ast: из текста в AST
tokenize - разбиение исходника на токены ast - построение синтаксического дерева … - нечем конвертировать исходный код в текст
16
Стандартная библиотека Python
Сторонние средства
astor https://github.com/berkerpeksag/astor
astmonkey https://github.com/konradhalas/astmonkey
astunparse https://github.com/simonpercivall/astunparse
Нет возможности влиять на стиль выводимого кода
Гарантированно не 100% соответствие даже при отсутствии изменений
18
Из AST в текст
Надстройка над библиотекой baron
Удобный механизм запросов
Работает с FST (!= AST)
Разбирает только Python 2
Сохраняет информацию о стиле:RedBaron(source_code).dumps() == source_code
19
redbaron
https://github.com/Psycojoker/redbaron
Предназначено для работы с исходным кодом
Сохраняет информацию о форматировании узлов
Более удобная для восприятия структура
“Под капотом” - JSON
20
FST: Full Source Tree
21
FST: Full Source Tree
Большой набор стандартных рефакторингов
Немного статического анализа
Документация сильно отстает от кода
Требует указания мест применения
Отлично работает в связке с IDE / другими библиотеками
22
rope
https://github.com/python-rope
Реальный код?
Вопросы?
Recommended