Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
190
ИИ-Агенты в каждый дом – Алексей Порядин, PythoNN
sobolevn
0
170
Внутреннее устройство сборки мусора в CPython 3.14+ – Сергей Мирянов, PythoNN
sobolevn
0
66
Генератор байткода и байткод генератора, Михаил Ефимов, PythoNN
sobolevn
0
61
Дотянуться до кремния. HighLoad Python: SIMD, GPU – Пётр Андреев, PythoNN
sobolevn
0
71
Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN
sobolevn
0
97
Continuous profiling, Давид Джалаев, PythoNN
sobolevn
0
100
Михаил Гурбанов – Are you NATS? @ PythoNN
sobolevn
0
130
Дмитрий Бровкин – Почему исправление опечаток сложнее, чем кажется, и как мы с этим српавляемся @ PythoNN
sobolevn
0
52
Other Decks in Programming
See All in Programming
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
190
AIエージェントの設計で注意するべきポイント6選
har1101
5
2.3k
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
160
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
110
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
270
TestingOsaka6_Ozono
o3
0
180
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
300
Implementation Patterns
denyspoltorak
0
120
Developing static sites with Ruby
okuramasafumi
0
330
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
260
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
340
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
140
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.4k
Docker and Python
trallard
47
3.7k
Raft: Consensus for Rubyists
vanstee
141
7.3k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Amusing Abliteration
ianozsvald
0
69
How to train your dragon (web standard)
notwaldorf
97
6.4k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
WENDY [Excerpt]
tessaabrams
8
35k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Evolving SEO for Evolving Search Engines
ryanjones
0
73
ラッコキーワード サービス紹介資料
rakko
0
1.8M
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