Slide 1

Slide 1 text

Никита Соболев github.com/sobolevn

Slide 2

Slide 2 text

>_ X Проблемы статических анализаторов в Python

Slide 3

Slide 3 text

Мы живем в уникальное время

Slide 4

Slide 4 text

Проблемы накопились!

Slide 5

Slide 5 text

Цель: мотивировать вас присоединиться к разработке инструментов будущего

Slide 6

Slide 6 text

Важно! Пользоваться текущими инструментами все равно полезно

Slide 7

Slide 7 text

>_ X Карта текущих решений

Slide 8

Slide 8 text

Flake8 Плагины

Slide 9

Slide 9 text

Flake8 Плагины pylint Плагины

Slide 10

Slide 10 text

Flake8 Плагины pylint Плагины mypy Плагины

Slide 11

Slide 11 text

Flake8 Плагины pylint Плагины mypy Плагины pylance

Slide 12

Slide 12 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype

Slide 13

Slide 13 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check

Slide 14

Slide 14 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black

Slide 15

Slide 15 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8

Slide 16

Slide 16 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit

Slide 17

Slide 17 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit yapf

Slide 18

Slide 18 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit yapf pyupgrade

Slide 19

Slide 19 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit yapf pyupgrade Линтеры

Slide 20

Slide 20 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры

Slide 21

Slide 21 text

Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры Авто-форматеры

Slide 22

Slide 22 text

>_ X Что лежит в основе?

Slide 23

Slide 23 text

ast = abstract syntax tree

Slide 24

Slide 24 text

print(name_with_meaning, second_name_with_meaning, third) 24

Slide 25

Slide 25 text

<_ast.Module> ┗━ body ┣━ [0] <_ast.Expr> ┃ ┗━ value: <_ast.Call> ┃ ┣━ args ┃ ┃ ┣━ [0] <_ast.Name> ┃ ┃ ┃ ┗━ id: first_long_name_with_meaning ┃ ┃ ┣━ [1] <_ast.Name> ┃ ┃ ┃ ┗━ id: second_very_long_name_with_meaning ┃ ┃ ┗━ [2] <_ast.Name> ┃ ┃ ┗━ id: third ┃ ┗━ func: <_ast.Name> ┃ ┗━ id: print 25

Slide 26

Slide 26 text

Используется > Почти во всех линтерах для анализа кода

Slide 27

Slide 27 text

Проблемы

Slide 28

Slide 28 text

Проблемы > Неконсистентность между версиями Python

Slide 29

Slide 29 text

Проблемы > Неконсистентность между версиями Python > Нет информации о типах

Slide 30

Slide 30 text

Проблемы > Неконсистентность между версиями Python > Нет информации о типах > Нет нюансов синтаксиса

Slide 31

Slide 31 text

Проблемы > Неконсистентность между версиями Python > Нет информации о типах > Нет нюансов синтаксиса > Нет комментариев

Slide 32

Slide 32 text

tokenize

Slide 33

Slide 33 text

29 print("test", a, b)

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Используется

Slide 36

Slide 36 text

Используется > Для проверки нюансов синтаксиса

Slide 37

Slide 37 text

Используется > Для проверки нюансов синтаксиса > Для авто-форматирования в некоторых инструментах

Slide 38

Slide 38 text

Проблемы

Slide 39

Slide 39 text

Проблемы > Представляет собой не "структуру", а простой список

Slide 40

Slide 40 text

Проблемы > Представляет собой не "структуру", а простой список > Вообще ничего не знает / не умеет

Slide 41

Slide 41 text

Проблемы > Представляет собой не "структуру", а простой список > Вообще ничего не знает / не умеет > Очень сложен в работе для правил с хоть какой-то логикой

Slide 42

Slide 42 text

libcst = Concrete Syntax Tree

Slide 43

Slide 43 text

Используется

Slide 44

Slide 44 text

Используется > В инфраструктуре Инстаграма

Slide 45

Slide 45 text

Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках для авто-форматирования

Slide 46

Slide 46 text

Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках для авто-форматирования > Для проверки нюансов синтаксиса

Slide 47

Slide 47 text

Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках для авто-форматирования > Для проверки нюансов синтаксиса > Для анализа кода

Slide 48

Slide 48 text

Проблемы

Slide 49

Slide 49 text

Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9

Slide 50

Slide 50 text

Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9 > Не работает с Python3.10+

Slide 51

Slide 51 text

typed-tree* *(такого нет)

Slide 52

Slide 52 text

Используется

Slide 53

Slide 53 text

Используется > В любом тайпчекере для представления нашего кода с типами

Slide 54

Slide 54 text

Используется > В любом тайпчекере для представления нашего кода с типами > Для каждого тайпчекера - оно свое

Slide 55

Slide 55 text

Проблемы

Slide 56

Slide 56 text

Проблемы > У каждой реализации они свои!

Slide 57

Slide 57 text

Проблемы > У каждой реализации они свои! > Нет единого стандарта

Slide 58

Slide 58 text

Проблемы > У каждой реализации они свои! > Нет единого стандарта > В каждом тайпчекере поддерживается далеко не все возможности

Slide 59

Slide 59 text

Проблемы > У каждой реализации они свои! > Нет единого стандарта > В каждом тайпчекере поддерживается далеко не все возможности > Нигде (кроме mypy) нет возможности подключать плагины

Slide 60

Slide 60 text

>_ X Пару слов про устаревшие инструменты

Slide 61

Slide 61 text

Flake8

Slide 62

Slide 62 text

Flake8 > Примитивная конфигурация

Slide 63

Slide 63 text

Flake8 > Примитивная конфигурация > Нет типов

Slide 64

Slide 64 text

Flake8 > Примитивная конфигурация > Нет типов > Невозможно нормально внедрить

Slide 65

Slide 65 text

Pylint

Slide 66

Slide 66 text

Pylint > Примитивная конфигурация

Slide 67

Slide 67 text

Pylint > Примитивная конфигурация > Нет типов

Slide 68

Slide 68 text

Pylint > Примитивная конфигурация > Нет типов > Но лучше бы их совсем не было

Slide 69

Slide 69 text

Pylint > Примитивная конфигурация > Нет типов > Но лучше бы их совсем не было > Невозможно нормально внедрить

Slide 70

Slide 70 text

Black

Slide 71

Slide 71 text

Black > Супер примитивный

Slide 72

Slide 72 text

Black > Супер примитивный > Использует lib2to3

Slide 73

Slide 73 text

>_ X Новые проблемы

Slide 74

Slide 74 text

Новый парсер / новая грамматика

Slide 75

Slide 75 text

Аннотации

Slide 76

Slide 76 text

Pattern Matching

Slide 77

Slide 77 text

>_ X Так что делать?

Slide 78

Slide 78 text

typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов > Авто-форматирование на токенах > Нормальное внедрение

Slide 79

Slide 79 text

Есть одно "но" github.com/sobolevn

Slide 80

Slide 80 text

А пока

Slide 81

Slide 81 text

Самый строгий линтер в мире github.com/wemake-services/wemake-python-styleguide

Slide 82

Slide 82 text

sobolevn.me/2019/10/complexity-waterfall 52

Slide 83

Slide 83 text

Подключайтесь к работе!

Slide 84

Slide 84 text

sobolevn.me Вопросы? github.com/sobolevn