$30 off During Our Annual Pro Sale. View Details »
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
160
Problems of static analysis in Python
Sobolev Nikita
June 13, 2021
Tweet
Share
More Decks by Sobolev Nikita
See All by Sobolev Nikita
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
180
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
160
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
63
Генератор байткода и байткод генератора, Михаил Ефимов, PythoNN
sobolevn
0
57
Дотянуться до кремния. HighLoad Python: SIMD, GPU – Пётр Андреев, PythoNN
sobolevn
0
68
Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN
sobolevn
0
92
Continuous profiling, Давид Джалаев, PythoNN
sobolevn
0
100
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
120
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
51
Other Decks in Programming
See All in Programming
認証・認可の基本を学ぼう後編
kouyuume
0
190
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
690
251126 TestState APIってなんだっけ?Step Functionsテストどう変わる?
east_takumi
0
320
AIコーディングエージェント(skywork)
kondai24
0
170
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
730
FluorTracer / RayTracingCamp11
kugimasa
0
230
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
120
How Software Deployment tools have changed in the past 20 years
geshan
0
29k
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
7
2.4k
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
390
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
150
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
We Have a Design System, Now What?
morganepeng
54
7.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
KATA
mclloyd
PRO
32
15k
Music & Morning Musume
bryan
46
7k
Building Applications with DynamoDB
mza
96
6.8k
Into the Great Unknown - MozCon
thekraken
40
2.2k
The Language of Interfaces
destraynor
162
25k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
GraphQLとの向き合い方2022年版
quramy
50
14k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
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