25

Автоматизированные рефакторинги: AST, FST и все-все-все

  • Upload
    -

  • View
    1.233

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Автоматизированные рефакторинги: AST, FST и все-все-все
Page 2: Автоматизированные рефакторинги: AST, FST и все-все-все

ya.cc/pyc15

Page 3: Автоматизированные рефакторинги: AST, FST и все-все-все

Автоматизируем рефакторинги: AST, FST и все-все-всеКирилл Борисов PyCon Russia 2015, 18-19 сентября 2015

Page 4: Автоматизированные рефакторинги: AST, FST и все-все-все

Поддержка старого кода

Уменьшение “копипасты”

Исправление ошибок

Повышение читаемости

4

Рефакторинг? Зачем?

Page 5: Автоматизированные рефакторинги: AST, FST и все-все-все

Совершенно согласен, отличный инструмент!

Идеален для интерактивного рефакторинга

Нет возможностей для массовой обработки

Слишком простые инструменты

Не все пользуются PyCharm

5

«Почему не PyCharm?»

Page 6: Автоматизированные рефакторинги: AST, FST и все-все-все

Отличное решение!

Но подходит только в простых случаях:

• Малое количество файлов

• Небольшие объемы кода (< 5 тысяч срок)

• Вносимые изменения элементарны или интуитивны

6

«Я руками быстрее справлюсь!»

Page 7: Автоматизированные рефакторинги: AST, FST и все-все-все

Файлов с исходным кодом: 1124

Строчек кода: 253 473 (~ 75% - тесты)

Тестов: 10 991

Общий объем: 220 мегабайт

7

Наши цифры: Яндекс.Паспорт

Page 8: Автоматизированные рефакторинги: AST, FST и все-все-все

Автоматизируйте это!

Page 9: Автоматизированные рефакторинги: AST, FST и все-все-все

Наличие тестов или тестировщиков

Есть представление о нужном результате

Изменения потенциально стоят затраченного времени

Легкое безумие :)

9

Необходимые условия

Page 10: Автоматизированные рефакторинги: AST, FST и все-все-все

1. Преобразуем исходный код в удобную структуру

2. Пропускаем структуру через фильтр

3. Оцениваем контекст

4. Вносим изменения

5. Выгружаем обратно исходный код

10

Методика внесения изменений

Page 11: Автоматизированные рефакторинги: AST, FST и все-все-все

“Батарейки”

Page 12: Автоматизированные рефакторинги: AST, FST и все-все-все

tokenize - разбиение исходника на токены

12

Стандартная библиотека Python

Page 13: Автоматизированные рефакторинги: AST, FST и все-все-все

13

tokenize: из текста в токены

Page 14: Автоматизированные рефакторинги: AST, FST и все-все-все

tokenize - разбиение исходника на токены ast - построение синтаксического дерева

14

Стандартная библиотека Python

Page 15: Автоматизированные рефакторинги: AST, FST и все-все-все

15

ast: из текста в AST

Page 16: Автоматизированные рефакторинги: AST, FST и все-все-все

tokenize - разбиение исходника на токены ast - построение синтаксического дерева … - нечем конвертировать исходный код в текст

16

Стандартная библиотека Python

Page 17: Автоматизированные рефакторинги: AST, FST и все-все-все

Сторонние средства

Page 18: Автоматизированные рефакторинги: AST, FST и все-все-все

astor https://github.com/berkerpeksag/astor

astmonkey https://github.com/konradhalas/astmonkey

astunparse https://github.com/simonpercivall/astunparse

Нет возможности влиять на стиль выводимого кода

Гарантированно не 100% соответствие даже при отсутствии изменений

18

Из AST в текст

Page 19: Автоматизированные рефакторинги: AST, FST и все-все-все

Надстройка над библиотекой baron

Удобный механизм запросов

Работает с FST (!= AST)

Разбирает только Python 2

Сохраняет информацию о стиле:RedBaron(source_code).dumps() == source_code

19

redbaron

https://github.com/Psycojoker/redbaron

Page 20: Автоматизированные рефакторинги: AST, FST и все-все-все

Предназначено для работы с исходным кодом

Сохраняет информацию о форматировании узлов

Более удобная для восприятия структура

“Под капотом” - JSON

20

FST: Full Source Tree

Page 21: Автоматизированные рефакторинги: AST, FST и все-все-все

21

FST: Full Source Tree

Page 22: Автоматизированные рефакторинги: AST, FST и все-все-все

Большой набор стандартных рефакторингов

Немного статического анализа

Документация сильно отстает от кода

Требует указания мест применения

Отлично работает в связке с IDE / другими библиотеками

22

rope

https://github.com/python-rope

Page 23: Автоматизированные рефакторинги: AST, FST и все-все-все

Реальный код?

Page 24: Автоматизированные рефакторинги: AST, FST и все-все-все

Вопросы?

Page 25: Автоматизированные рефакторинги: AST, FST и все-все-все

Кирилл Борисов

Спасибо!

@lensvol

[email protected]

lensvol