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

Problems of static analysis in Python

Problems of static analysis in Python

8c3a2ebf7c2b84f8390d99c7bf8c8a48?s=128

Sobolev Nikita

June 13, 2021
Tweet

Transcript

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

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

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

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

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

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

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

  8. Flake8 Плагины

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

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

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

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

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

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

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

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

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

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

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

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

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

    autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры Авто-форматеры
  22. >_ X Что лежит в основе?

  23. ast = abstract syntax tree

  24. print(name_with_meaning, second_name_with_meaning, third) 24

  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
  26. Используется > Почти во всех линтерах для анализа кода

  27. Проблемы

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

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

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

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

    типах > Нет нюансов синтаксиса > Нет комментариев
  32. tokenize

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

  34. None
  35. Используется

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

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

    некоторых инструментах
  38. Проблемы

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

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

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

    Вообще ничего не знает / не умеет > Очень сложен в работе для правил с хоть какой-то логикой
  42. libcst = Concrete Syntax Tree

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

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

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

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

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

    для авто-форматирования > Для проверки нюансов синтаксиса > Для анализа кода
  48. Проблемы

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

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

    работает с Python3.10+
  51. typed-tree* *(такого нет)

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

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

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

    типами > Для каждого тайпчекера - оно свое
  55. Проблемы

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

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

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

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

    стандарта > В каждом тайпчекере поддерживается далеко не все возможности > Нигде (кроме mypy) нет возможности подключать плагины
  60. >_ X Пару слов про устаревшие инструменты

  61. Flake8

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

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

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

    внедрить
  65. Pylint

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

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

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

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

    бы их совсем не было > Невозможно нормально внедрить
  70. Black

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

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

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

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

  75. Аннотации

  76. Pattern Matching

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

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

    > Авто-форматирование на токенах > Нормальное внедрение
  79. Есть одно "но" github.com/sobolevn

  80. А пока

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

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

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

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