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
Проверка типов в большом проекте
Search
Maxim Mazaev
June 24, 2019
Programming
0
23
Проверка типов в большом проекте
Опыт внедрения проверки типов с помощью mypy в ЦИАН
Выступление на PyCon Russia 2019
Maxim Mazaev
June 24, 2019
Tweet
Share
More Decks by Maxim Mazaev
See All by Maxim Mazaev
Как прокачать линтер
mmazaev
0
33
Pylint изнутри. Как он это делает
mmazaev
0
79
Как поддерживать согласованность в микросервисной архитектуре
mmazaev
0
53
Other Decks in Programming
See All in Programming
GoのGenericsによるslice操作との付き合い方
syumai
3
700
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
1k
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
590
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
250
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
280
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
620
Cursor AI Agentと伴走する アプリケーションの高速リプレイス
daisuketakeda
1
130
dbt民主化とLLMによる開発ブースト ~ AI Readyな分析サイクルを目指して ~
yoshyum
0
190
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
660
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
340
A2A プロトコルを試してみる
azukiazusa1
2
1.3k
プロダクト志向なエンジニアがもう一歩先の価値を目指すために意識したこと
nealle
0
120
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
A Tale of Four Properties
chriscoyier
160
23k
Adopting Sorbet at Scale
ufuk
77
9.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Side Projects
sachag
455
42k
Designing for humans not robots
tammielis
253
25k
Rails Girls Zürich Keynote
gr2m
94
14k
BBQ
matthewcrist
89
9.7k
Transcript
1 Проверка типов в большом проекте Максим Мазаев
Программист в ЦИАН 6 лет пишу на Python Спикер PyCon,
Moscow Python Conf++ 2 О себе
О чем я расскажу 3 • Статическая типизация. Плюсы, минусы,
подводные камни
О чем я расскажу 4 • Статическая типизация. Плюсы, минусы,
подводные камни • Инструменты проверки типов
О чем я расскажу 5 • Статическая типизация. Плюсы, минусы,
подводные камни • Инструменты проверки типов • Практические проблемы
6 def say_hi(name: str) -> None: print(f’Hi, {name}!’)
• 1 млн уникальных пользователей в сутки • 200+ микросервисов
(120 на Python) • 100+ разработчиков • 30 питонистов 7 О ЦИАН
Взрывной рост IT департамента (10x за 4 года) 8 2016
год в ЦИАН
Взрывной рост IT департамента (10x за 4 года) 9 2016
год в ЦИАН Проблема: тратим время на понимание чужого кода
def serialize_entity( entity, strip_description_tags, reviews, ): 10 WTF WTF WTF
WTF
def serialize_entity( entity: Offer, strip_description_tags: bool, reviews: List[Review], ) ->
SerializedEntity: 11 PEP 484
2016 год в ЦИАН 12 Начинаем покрывать тайпхинтами весь новый
код 2016 2019 100% ~95% кода с тайпхинтами
2016 год в ЦИАН 13 Пишем тайпхинты, без проверки тайпчекером
2016 год в ЦИАН 14 • Профит сразу Пишем тайпхинты,
без проверки тайпчекером
2016 год в ЦИАН 15 • Профит сразу • Самодокументированный
код Пишем тайпхинты, без проверки тайпчекером
2016 год в ЦИАН 16 • Профит сразу • Самодокументированный
код • Быстрый онбординг Пишем тайпхинты, без проверки тайпчекером
2016 год в ЦИАН 17 • Профит сразу • Самодокументированный
код • Быстрый онбординг • Проверка есть в линтере и редакторах * Пишем тайпхинты, без проверки тайпчекером
Прошло 2 года... 18
Проблема: Наши тайпхинты не всегда консистентны 19
Проблема: Наши тайпхинты не всегда консистентны 20 Нужен тайпчекер
Выбор тайпчекера 21 mypy (Dropbox) pyright (Microsoft) pyre (Facebook) pytype
(Google)
Выбор тайпчекера 22 mypy
Почему mypy? 23 • Активно развивается
Почему mypy? 24 • Активно развивается • Написан на Python
Почему mypy? 25 • Активно развивается • Написан на Python
• Расширяемый (плагины)
Первые препятствия 26
27 Несовпадение типов В каждом сервисе есть невалидные тайпхинты Исправление
занимает время (до 4-5 часов)
28 Type stubs для внешних зависимостей def get_reviews(key: int) ->
List[Reviews]: ...
https://github.com/python/typeshed - для популярных библиотек 29 Type stubs для внешних
зависимостей def get_reviews(key: int) -> List[Reviews]: ...
https://github.com/python/typeshed - для популярных библиотек PEP 561 - Distributing and
Packaging Type Information 30 Type stubs для внешних зависимостей def get_reviews(key: int) -> List[Reviews]: ...
31 Я не хочу писать типы руками Инструменты для генерации
аннотаций типов: pyannotate pytest-annotate
32 Метаклассы class Builder(Entity): name = String() b = Builder(name="xxx")
gimme_builder(b) # OK gimme_dict(b.name) # Не ОК, но mypy не против
33 Метаклассы Плагины решают проблему с метаклассами
• Есть готовые: dataclasses, attrs, Django, SQLAlchemy etc. • Можно
написать свои 34 Плагины mypy
• Есть готовые: dataclasses, attrs, Django, SQLAlchemy etc. • Можно
написать свои WARNING: нестабильное API и мало документации 35 Плагины mypy
36 Что почитать по разработке плагинов Статья «Extending mypy with
plugins» http://tiny.cc/mypy_plugins Чат про типы https://gitter.im/python/typing
37 Давайте поможем mypy определить тип set_data[type_.name].append(get_value(foo))
38 Давайте поможем mypy определить тип set_data[type_.name].append(get_value(foo)) • cast()
39 Давайте поможем mypy определить тип set_data[type_.name].append(get_value(foo)) • cast() •
# type: ignore
Регулярная проверка всей кодовой базы 40 Следующий этап EAT. SLEEP.
MYPY. REPEAT.
41 Интеграция с CI/CD + mypy =
42 Интеграция с CI/CD + mypy =
43 Подробнее про наш CI/CD: РИТ++ 2019 Александр Коротков «
Как доставить быстро и без боли. Автоматизируем релизы»
• Хорошее дополнение к тестам и линтеру 44 Польза от
проверки типов
• Хорошее дополнение к тестам и линтеру • Повод для
самоанализа - а мой код точно хороший? 45 Польза от проверки типов
• Хорошее дополнение к тестам и линтеру • Повод для
самоанализа - а мой код точно хороший? • Тайпхинтам можно верить 46 Польза от проверки типов
• Хорошее дополнение к тестам и линтеру • Повод для
самоанализа - а мой код точно хороший? • Тайпхинтам можно верить • Люди быстрее вливаются в проект 47 Польза от проверки типов
Качество 48 Польза от проверки типов Time To Market
49 Напутствие напоследок
• Действуйте итеративно 50 Напутствие напоследок
• Действуйте итеративно • Инструмент вторичен, проверка типов уже есть
в вашей IDE 51 Напутствие напоследок
52 Максим Мазаев
[email protected]
facebook.com/mazaev.maksim Пишите аннотации типов - это
затягивает!