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
24
Проверка типов в большом проекте
Опыт внедрения проверки типов с помощью mypy в ЦИАН
Выступление на PyCon Russia 2019
Maxim Mazaev
June 24, 2019
Tweet
Share
More Decks by Maxim Mazaev
See All by Maxim Mazaev
Как прокачать линтер
mmazaev
0
34
Pylint изнутри. Как он это делает
mmazaev
0
91
Как поддерживать согласованность в микросервисной архитектуре
mmazaev
0
59
Other Decks in Programming
See All in Programming
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
140
2026年 エンジニアリング自己学習法
yumechi
0
140
並行開発のためのコードレビュー
miyukiw
0
1.2k
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
180
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
140
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
230
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
140
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
180
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
Featured
See All Featured
The Invisible Side of Design
smashingmag
302
51k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
SEO for Brand Visibility & Recognition
aleyda
0
4.2k
Designing for Timeless Needs
cassininazir
0
130
Embracing the Ebb and Flow
colly
88
5k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Testing 201, or: Great Expectations
jmmastey
46
8.1k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
780
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
130
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
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 Пишите аннотации типов - это
затягивает!