Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Проверка типов в большом проекте
Search
Maxim Mazaev
June 24, 2019
Programming
31
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Проверка типов в большом проекте
Опыт внедрения проверки типов с помощью mypy в ЦИАН
Выступление на PyCon Russia 2019
Maxim Mazaev
June 24, 2019
More Decks by Maxim Mazaev
See All by Maxim Mazaev
Как прокачать линтер
mmazaev
0
45
Pylint изнутри. Как он это делает
mmazaev
0
100
Как поддерживать согласованность в микросервисной архитектуре
mmazaev
0
64
Other Decks in Programming
See All in Programming
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
JIS keyboard support in Omarchy
lef237
0
140
Railsバージョンを4倍にした話
optim
0
460
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
440
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
510
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
AWSに止められる覚悟してますか?
morizo_1984
2
540
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
460
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
330
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
240
Workers Cache を知る
syumai
0
370
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
529
40k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
The agentic SEO stack - context over prompts
schlessera
0
970
Building Adaptive Systems
keathley
44
3.3k
Music & Morning Musume
bryan
48
7.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
420
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
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 Пишите аннотации типов - это
затягивает!