Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Problems of static analysis in Python
Search
Sobolev Nikita
June 13, 2021
Programming
0
150
Problems of static analysis in Python
Sobolev Nikita
June 13, 2021
Tweet
Share
More Decks by Sobolev Nikita
See All by Sobolev Nikita
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
59
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
38
Алексей Гончарук – Современный веб с темлейтами @ PythoNN
sobolevn
0
110
Алексей Голобурдин – Демистификация PostgreSQL-индексов @ PythoNN
sobolevn
0
160
PythoNN – Александр Гончаров
sobolevn
0
69
PythoNN – Андрей Пронин
sobolevn
0
130
PythoNN: Василий Рябов – "Парсинг бинарных данных с помощью ctypes, или пишем на питоне как на Си"
sobolevn
0
250
GitHub Planet - OpenSource
sobolevn
0
280
Polymorphism and Typeclasses
sobolevn
2
170
Other Decks in Programming
See All in Programming
ProxyによるWindow間RPC機構の構築
syumai
3
1.2k
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
170
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
510
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.5k
RDoc meets YARD
okuramasafumi
4
170
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
🔨 小さなビルドシステムを作る
momeemt
4
690
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
120
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
190
Navigating Dependency Injection with Metro
zacsweers
3
2.5k
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
250
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Building an army of robots
kneath
306
46k
Speed Design
sergeychernyshev
32
1.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Balancing Empowerment & Direction
lara
3
620
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
KATA
mclloyd
32
14k
Building Adaptive Systems
keathley
43
2.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Invisible Side of Design
smashingmag
301
51k
What's in a price? How to price your products and services
michaelherold
246
12k
Transcript
Никита Соболев github.com/sobolevn
>_ X Проблемы статических анализаторов в Python
Мы живем в уникальное время
Проблемы накопились!
Цель: мотивировать вас присоединиться к разработке инструментов будущего
Важно! Пользоваться текущими инструментами все равно полезно
>_ X Карта текущих решений
Flake8 Плагины
Flake8 Плагины pylint Плагины
Flake8 Плагины pylint Плагины mypy Плагины
Flake8 Плагины pylint Плагины mypy Плагины pylance
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit yapf
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit yapf pyupgrade
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit yapf pyupgrade Линтеры
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры
Flake8 Плагины pylint Плагины mypy Плагины pylance pytype pyre-check black
autopep8 fixit yapf pyupgrade Тайпчекеры Линтеры Авто-форматеры
>_ X Что лежит в основе?
ast = abstract syntax tree
print(name_with_meaning, second_name_with_meaning, third) 24
<_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
Используется > Почти во всех линтерах для анализа кода
Проблемы
Проблемы > Неконсистентность между версиями Python
Проблемы > Неконсистентность между версиями Python > Нет информации о
типах
Проблемы > Неконсистентность между версиями Python > Нет информации о
типах > Нет нюансов синтаксиса
Проблемы > Неконсистентность между версиями Python > Нет информации о
типах > Нет нюансов синтаксиса > Нет комментариев
tokenize
29 print("test", a, b)
None
Используется
Используется > Для проверки нюансов синтаксиса
Используется > Для проверки нюансов синтаксиса > Для авто-форматирования в
некоторых инструментах
Проблемы
Проблемы > Представляет собой не "структуру", а простой список
Проблемы > Представляет собой не "структуру", а простой список >
Вообще ничего не знает / не умеет
Проблемы > Представляет собой не "структуру", а простой список >
Вообще ничего не знает / не умеет > Очень сложен в работе для правил с хоть какой-то логикой
libcst = Concrete Syntax Tree
Используется
Используется > В инфраструктуре Инстаграма
Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках
для авто-форматирования
Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках
для авто-форматирования > Для проверки нюансов синтаксиса
Используется > В инфраструктуре Инстаграма > Во многих новых библиотеках
для авто-форматирования > Для проверки нюансов синтаксиса > Для анализа кода
Проблемы
Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9
Проблемы > Сбоит на некоторых синтаксических конструкциях Python3.9 > Не
работает с Python3.10+
typed-tree* *(такого нет)
Используется
Используется > В любом тайпчекере для представления нашего кода с
типами
Используется > В любом тайпчекере для представления нашего кода с
типами > Для каждого тайпчекера - оно свое
Проблемы
Проблемы > У каждой реализации они свои!
Проблемы > У каждой реализации они свои! > Нет единого
стандарта
Проблемы > У каждой реализации они свои! > Нет единого
стандарта > В каждом тайпчекере поддерживается далеко не все возможности
Проблемы > У каждой реализации они свои! > Нет единого
стандарта > В каждом тайпчекере поддерживается далеко не все возможности > Нигде (кроме mypy) нет возможности подключать плагины
>_ X Пару слов про устаревшие инструменты
Flake8
Flake8 > Примитивная конфигурация
Flake8 > Примитивная конфигурация > Нет типов
Flake8 > Примитивная конфигурация > Нет типов > Невозможно нормально
внедрить
Pylint
Pylint > Примитивная конфигурация
Pylint > Примитивная конфигурация > Нет типов
Pylint > Примитивная конфигурация > Нет типов > Но лучше
бы их совсем не было
Pylint > Примитивная конфигурация > Нет типов > Но лучше
бы их совсем не было > Невозможно нормально внедрить
Black
Black > Супер примитивный
Black > Супер примитивный > Использует lib2to3
>_ X Новые проблемы
Новый парсер / новая грамматика
Аннотации
Pattern Matching
>_ X Так что делать?
typed-linter > Нормальная конфигурация в духе eslint > Провайдеры типов
> Авто-форматирование на токенах > Нормальное внедрение
Есть одно "но" github.com/sobolevn
А пока
Самый строгий линтер в мире github.com/wemake-services/wemake-python-styleguide
sobolevn.me/2019/10/complexity-waterfall 52
Подключайтесь к работе!
sobolevn.me Вопросы? github.com/sobolevn