Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Problems of static analysis in Python

Problems of static analysis in Python

Sobolev Nikita

June 13, 2021
Tweet

More Decks by Sobolev Nikita

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. Flake8
    Плагины

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. ast
    =
    abstract syntax tree

    View full-size slide

  24. print(name_with_meaning, second_name_with_meaning, third)
    24

    View full-size slide

  25. <_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

    View full-size slide

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

    View full-size slide

  27. Проблемы

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. 29
    print("test", a, b)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. Проблемы

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  40. libcst
    =
    Concrete Syntax Tree

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. Проблемы

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  53. Проблемы

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  70. Аннотации

    View full-size slide

  71. Pattern Matching

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide