
Современные проекты на языке Python непрерывно растут, развиваются и при этом неизбежно усложняются. Добиться надежности кода Python при сохранении гибкости, понятности и расширяемости приложений позволяет система типов, которая в данной книге подробно исследована в рамках парадигмы ООП. Особое внимание уделяется аннотированию и проверке типов, а также созданию пользовательских специализированных типов. Продвинутые главы книги посвящены вопросам тестирования, линтинга и обеспечения надежности программ на Python.
Для программистов
Пишем чистый код, который удобно поддерживать
Вам кажется, что ваши проекты Python становятся все больше и больше? Вас охватывает паника по мере того, как ваш программный код расширяется и его становится все труднее отлаживать и поддерживать? Python — это простой язык для изучения и использования, но это также означает, что системы могут быстро выйти за пределы понимания разработчика. К счастью, в Python есть функции, помогающие разработчикам преодолеть проблемы с ремонтопригодностью.
Прочитав книгу Вы:
- узнаете, как максимально использовать систему типов Python;
- познакомитесь с определяемыми пользователем типами, такими как классы и перечисления, а также с системой подсказок типов Python;
- научитесь использовать в качестве подстраховки комплексную стратегию тестирования;
- узнаете, как сделать Python расширяемым.
С помощью этих советов и приемов вы сможете писать более понятный и удобный для сопровождения код.
Книга идеально подходит для
- разработчиков, которые в настоящее время работают с большой кодовой базой и пытаются найти более эффективные способы взаимодействия со своими коллегами;
- специалистов по первоначальному сопровождению программного кода, которые ищут способы уменьшить нагрузку при сопровождении в будущем;
- самоучек, которые хорошо владеют языком программирования Python, но хотят лучше понимать, почему и что мы делаем;
- начинающих специалистов в области информационных технологий, которым нужны практические советы по разработке;
- опытных разработчиков, которые ищут способ, как обосновать свой дизайн, опираясь на основные принципы надежности.
Моя книга сосредоточена на том, чтобы разработчики, унаследовавшие ваш код, не вносили новых ошибок в вашу систему. Я покажу вам, как общаться с будущими разработчиками, как упростить им работу с помощью архитектурных шаблонов и как выявлять ошибки в кодовой базе до того, как они попадут в готовый продукт. Основное внимание в книге уделяется надежности вашей кодовой базы на Python, а не надежности вашей системы в целом.
Патрик Виафоре

Патрик Виафоре более 13 лет занимался разработкой ПО повышенной надежности, в том числе для обнаружения молний, решения телекоммуникационных задач. Участвовал в разработке операционных систем. В настоящее время руководит собственной компанией Kudzera, LLC, занимающейся консалтингом и заказными проектами, связанными с Ubuntu. Свою миссию видит в демократизации высококачественной программной инженерии на благо профессионального сообщества.
Книгу “Надежный Python” можно купить со скидкой в интернет-магазине издательства “БХВ“.
Введение………………………………………………………………………………………………… 11
Для кого предназначена книга?……………………………………………………………………………………………….. 12
О чем эта книга?…………………………………………………………………………………………………………………………. 13
Условные обозначения……………………………………………………………………………………………………………… 15
Использование примеров кода…………………………………………………………………………………………………. 15
Как с нами связаться………………………………………………………………………………………………………………….. 16
Благодарности…………………………………………………………………………………………………………………………… 16
Глава 1. Введение в надежный Python……………………………………………………. 19
Надежность кодовой базы………………………………………………………………………………………………………… 19
Почему важна надежность?…………………………………………………………………………………………… 22
Обмен полезной информацией………………………………………………………………………………………………….. 23
Асинхронное взаимодействие……………………………………………………………………………………….. 26
Примеры понятного кода на Python…………………………………………………………………………………………. 29
Коллекции……………………………………………………………………………………………………………………….. 29
Итерации…………………………………………………………………………………………………………………………. 32
Принцип наименьшего удивления…………………………………………………………………………………. 34
Резюме…………………………………………………………………………………………………………………………………………. 35
Часть I. Аннотации типов…………………………………………………………… 37
Глава 2. Введение в типы Python……………………………………………………………. 39
Что такое тип?……………………………………………………………………………………………………………………………. 39
Машинное представление……………………………………………………………………………………………… 39
Семантическое представление……………………………………………………………………………………… 41
Системы типов……………………………………………………………………………………………………………………………. 44
Сильная и слабая типизации…………………………………………………………………………………………. 44
Динамическая и статическая типизации………………………………………………………………………. 45
Неявная (утиная) типизация………………………………………………………………………………………….. 46
Резюме…………………………………………………………………………………………………………………………………………. 48
Глава 3. Аннотации типов……………………………………………………………………… 49
Что такое аннотации типов?…………………………………………………………………………………………………….. 49
Использование аннотаций типов……………………………………………………………………………………………… 53
Автодополнение……………………………………………………………………………………………………………… 53
Проверка типов……………………………………………………………………………………………………………….. 53
Примеры найденных ошибок………………………………………………………………………………………… 55
Когда добавлять аннотации типа…………………………………………………………………………………………….. 57
Резюме…………………………………………………………………………………………………………………………………………. 57
Глава 4. Ограничивающие типы……………………………………………………………. 59
Аннотация Optional…………………………………………………………………………………………………………………… 59
Аннотация Union……………………………………………………………………………………………………………………….. 65
Тип-произведение и тип-сумма……………………………………………………………………………………… 67
Аннотация Literal………………………………………………………………………………………………………………………. 69
Аннотация Annotated…………………………………………………………………………………………………………………. 70
Аннотация NewType…………………………………………………………………………………………………………………… 70
Аннотация Final…………………………………………………………………………………………………………………………. 73
Резюме…………………………………………………………………………………………………………………………………………. 74
Глава 5. Коллекции……………………………………………………………………………….. 75
Аннотирование коллекций………………………………………………………………………………………………………… 75
Однородные и разнородные коллекции…………………………………………………………………………………… 76
Аннотация TypedDict…………………………………………………………………………………………………………………. 80
Создание новых типов коллекций……………………………………………………………………………………………. 82
Дженерики……………………………………………………………………………………………………………………….. 83
Изменение существующих типов………………………………………………………………………………….. 85
Так же просто, как ABC…………………………………………………………………………………………………. 88
Резюме…………………………………………………………………………………………………………………………………………. 90
Глава 6. Настройка проверки типов………………………………………………………. 91
Инструмент проверки типов mypy…………………………………………………………………………………………… 91
Параметры конфигурации……………………………………………………………………………………………… 92
Поиск динамической типизации……………………………………………………………………………. 93
Нетипизированные функции…………………………………………………………………………………. 94
Отслеживание None/Optional………………………………………………………………………………… 94
Отчеты mypy…………………………………………………………………………………………………………………… 95
Ускорение mypy……………………………………………………………………………………………………………… 96
Другие инструменты проверки типов………………………………………………………………………………………. 97
Pyre…………………………………………………………………………………………………………………………………… 97
Запросы к кодовой базе…………………………………………………………………………………………. 98
Pysa………………………………………………………………………………………………………………………… 100
Pyright…………………………………………………………………………………………………………………………….. 103
Резюме………………………………………………………………………………………………………………………………………. 105
Глава 7. Внедрение проверки типов……………………………………………………… 106
Поиск компромиссов……………………………………………………………………………………………………………….. 107
Быстрое получение выгоды……………………………………………………………………………………………………. 108
Поиск слабых мест……………………………………………………………………………………………………….. 108
Стратегические фрагменты кода………………………………………………………………………………… 109
Аннотирование только нового кода…………………………………………………………………… 109
Аннотирование снизу вверх………………………………………………………………………………… 109
Аннотирование основной бизнес-логики…………………………………………………………… 110
Аннотирование часто меняющегося кода………………………………………………………….. 110
Аннотирование сложного кода…………………………………………………………………………… 110
Использование инструментов……………………………………………………………………………………… 110
MonkeyType………………………………………………………………………………………………………….. 112
Pytype…………………………………………………………………………………………………………………….. 116
Резюме………………………………………………………………………………………………………………………………………. 117
Часть II. Определение ваших собственных типов…………. 119
Глава 8. Пользовательские типы: перечисления………………………………….. 121
Пользовательские типы…………………………………………………………………………………………………………… 121
Перечисления…………………………………………………………………………………………………………………………… 122
Тип Enum……………………………………………………………………………………………………………………….. 124
Когда не надо их использовать…………………………………………………………………………………… 125
Дополнительные возможности……………………………………………………………………………………………….. 126
Автоматические значения……………………………………………………………………………………………. 126
Тип Flag…………………………………………………………………………………………………………………………. 127
Целочисленные перечисления…………………………………………………………………………………….. 129
Уникальные значения…………………………………………………………………………………………………… 130
Резюме………………………………………………………………………………………………………………………………………. 131
Глава 9. Пользовательские типы: классы данных……………………………….. 132
Примеры классов данных……………………………………………………………………………………………………….. 132
Использование классов данных……………………………………………………………………………………………… 136
Строковые представления…………………………………………………………………………………………… 136
Равенство………………………………………………………………………………………………………………………. 137
Реляционное сравнение……………………………………………………………………………………………….. 138
Неизменяемость……………………………………………………………………………………………………………. 139
Сравнение с другими типами………………………………………………………………………………………………….. 141
Классы данных и словари…………………………………………………………………………………………… 141
Классы данных и TypedDict………………………………………………………………………………………… 142
Классы данных и namedtuple………………………………………………………………………………………. 142
Резюме………………………………………………………………………………………………………………………………………. 143
Глава 10. Пользовательские типы: классы…………………………………………… 144
Строение класса………………………………………………………………………………………………………………………. 144
Конструктор………………………………………………………………………………………………………………….. 145
Инварианты……………………………………………………………………………………………………………………………… 146
Нарушение инвариантов……………………………………………………………………………………………… 148
Зачем нужны инварианты……………………………………………………………………………………………. 149
Информативные инварианты………………………………………………………………………………………. 151
Для пользователей класса…………………………………………………………………………………… 152
При сопровождении кода…………………………………………………………………………………….. 153
Инкапсуляция и поддержка инвариантов……………………………………………………………………………… 155
Инкапсуляция……………………………………………………………………………………………………………….. 155
Доступ к данным…………………………………………………………………………………………………………… 155
Работа с данными…………………………………………………………………………………………………………. 158
Резюме………………………………………………………………………………………………………………………………………. 160
Глава 11. Определение своих интерфейсов…………………………………………… 162
Проектирование естественного интерфейса…………………………………………………………………………. 163
Думай как пользователь………………………………………………………………………………………………. 164
Разработка через тестирование………………………………………………………………………….. 164
Разработка через README…………………………………………………………………………………. 165
Юзабилити-тестирование……………………………………………………………………………………. 166
Естественные взаимодействия………………………………………………………………………………………………… 167
Естественные интерфейсы в действии………………………………………………………………………… 167
Магические методы……………………………………………………………………………………………………… 173
Контекстные менеджеры……………………………………………………………………………………………… 175
Резюме………………………………………………………………………………………………………………………………………. 177
Глава 12. Создание подтипов……………………………………………………………….. 178
Наследование…………………………………………………………………………………………………………………………… 178
Взаимозаменяемость……………………………………………………………………………………………………………….. 183
Рекомендации по проектированию………………………………………………………………………………………… 188
Композиция…………………………………………………………………………………………………………………… 189
Резюме………………………………………………………………………………………………………………………………………. 191
Глава 13. Протоколы……………………………………………………………………………. 193
Структурная и номинальная типизации………………………………………………………………………………… 193
Пустой тип и Any…………………………………………………………………………………………………………… 195
Использование Union…………………………………………………………………………………………………… 195
Использование наследования……………………………………………………………………………………… 196
Использование миксинов……………………………………………………………………………………………… 197
Протоколы………………………………………………………………………………………………………………………………… 198
Создание протокола…………………………………………………………………………………………………….. 199
Расширенное использование………………………………………………………………………………………………….. 200
Составные протоколы………………………………………………………………………………………………….. 200
Протоколы времени выполнения………………………………………………………………………………… 201
Протоколы для модулей………………………………………………………………………………………………. 202
Резюме………………………………………………………………………………………………………………………………………. 203
Глава 14. Проверки во время выполнения с помощью pydantic……………. 204
Динамическая конфигурация………………………………………………………………………………………………….. 204
Библиотека pydantic………………………………………………………………………………………………………………… 210
Валидаторы………………………………………………………………………………………………………………….. 212
Валидация и парсинг……………………………………………………………………………………………………. 215
Резюме………………………………………………………………………………………………………………………………………. 216
Часть III. Расширяемый код……………………………………………………… 219
Глава 15. Расширяемость……………………………………………………………………… 221
Что такое расширяемость?……………………………………………………………………………………………………… 221
Реструктуризация кода………………………………………………………………………………………………… 223
Принцип открытости/закрытости…………………………………………………………………………………………… 227
Поиск нарушений принципа………………………………………………………………………………………… 228
Недостатки OCP……………………………………………………………………………………………………………. 229
Резюме………………………………………………………………………………………………………………………………………. 230
Глава 16. Зависимости…………………………………………………………………………. 231
Взаимосвязи……………………………………………………………………………………………………………………………… 232
Типы зависимостей………………………………………………………………………………………………………………….. 234
Физические зависимости……………………………………………………………………………………………… 234
Логические зависимости………………………………………………………………………………………………. 238
Временные зависимости………………………………………………………………………………………………. 240
Визуализация зависимостей…………………………………………………………………………………………………… 241
Визуализация пакетов………………………………………………………………………………………………….. 242
Визуализация импорта………………………………………………………………………………………………… 243
Визуализация вызовов функций………………………………………………………………………………….. 243
Интерпретация графа зависимостей…………………………………………………………………………… 245
Резюме………………………………………………………………………………………………………………………………………. 246
Глава 17. Компонуемость…………………………………………………………………….. 248
Что такое компонуемость?……………………………………………………………………………………………………… 248
Разделение политик и механизмов…………………………………………………………………………………………. 252
Компонуемость в меньшем масштабе……………………………………………………………………………………. 255
Компонуемые функции………………………………………………………………………………………………… 255
Декораторы…………………………………………………………………………………………………………… 256
Компонуемые алгоритмы…………………………………………………………………………………………….. 259
Резюме………………………………………………………………………………………………………………………………………. 262
Глава 18. Событийно-ориентированная архитектура…………………………… 263
Как это работает……………………………………………………………………………………………………………………… 263
Недостатки……………………………………………………………………………………………………………………. 264
Простые события……………………………………………………………………………………………………………………… 266
Использование брокера сообщений……………………………………………………………………………. 266
Шаблон наблюдателя………………………………………………………………………………………………….. 268
Поток событий…………………………………………………………………………………………………………………………. 270
Резюме………………………………………………………………………………………………………………………………………. 273
Глава 19. Подключаемый код………………………………………………………………. 274
Шаблонный метод…………………………………………………………………………………………………………………… 275
Шаблон стратегии…………………………………………………………………………………………………………………… 278
Архитектура плагинов…………………………………………………………………………………………………………….. 279
Резюме………………………………………………………………………………………………………………………………………. 283
Часть IV. Ваша страховочная сетка……………………………………… 285
Глава 20. Статический анализ……………………………………………………………… 287
Линтинг…………………………………………………………………………………………………………………………………….. 287
Написание собственного плагина для Pylint……………………………………………………………… 289
Разбор плагина……………………………………………………………………………………………………………… 291
Другие статические анализаторы………………………………………………………………………………………….. 293
Проверки сложности…………………………………………………………………………………………………….. 294
Цикломатическая сложность Маккейба…………………………………………………………….. 294
Проверка отступов……………………………………………………………………………………………….. 296
Анализ безопасности……………………………………………………………………………………………………. 297
Утечка секретных данных…………………………………………………………………………………… 297
Проверка уязвимостей…………………………………………………………………………………………. 297
Резюме………………………………………………………………………………………………………………………………………. 298
Глава 21. Стратегия тестирования……………………………………………………….. 299
Определение вашей стратегии тестирования……………………………………………………………………….. 299
Что такое тесты?…………………………………………………………………………………………………………… 300
Пирамида тестирования………………………………………………………………………………………. 302
Снижение стоимости тестирования……………………………………………………………………………………….. 304
AAA-тестирование……………………………………………………………………………………………………….. 304
Arrange (настройка предусловий)……………………………………………………………………….. 305
Annihilate (очистка ресурсов)……………………………………………………………………………… 308
Act (действие)……………………………………………………………………………………………………….. 310
Assert (утверждение)…………………………………………………………………………………………….. 311
Резюме………………………………………………………………………………………………………………………………………. 314
Глава 22. Приемочное тестирование…………………………………………………….. 315
Разработка через поведение (BDD)………………………………………………………………………………………… 316
Язык Gherkin………………………………………………………………………………………………………………….. 316
Исполняемые спецификации……………………………………………………………………………………….. 318
Дополнительные возможности behave…………………………………………………………………………………… 321
Параметризованные шаги……………………………………………………………………………………………. 321
Требования, составленные в виде таблиц………………………………………………………………….. 321
Регулярные выражения………………………………………………………………………………………………… 322
Настройка жизненного цикла теста……………………………………………………………………………. 322
Использование тегов для выборочного запуска тестов……………………………………………. 323
Генерация отчетов……………………………………………………………………………………………………….. 323
Резюме………………………………………………………………………………………………………………………………………. 325
Глава 23. Тестирование на основе свойств…………………………………………… 326
Тестирование с помощью Hypothesis…………………………………………………………………………………….. 326
Магия Hypothesis………………………………………………………………………………………………………….. 330
Отличия от традиционных тестов………………………………………………………………………………. 331
Дополнительные возможности Hypothesis……………………………………………………………………………. 332
Стратегии Hypothesis…………………………………………………………………………………………………… 332
Генерирование алгоритмов…………………………………………………………………………………………. 333
Резюме………………………………………………………………………………………………………………………………………. 337
Глава 24. Мутационное тестирование………………………………………………….. 338
Что такое мутационное тестирование?…………………………………………………………………………………. 338
Использование mutmut…………………………………………………………………………………………………………….. 341
Исправление мутантов…………………………………………………………………………………………………. 343
Отчеты о тестировании………………………………………………………………………………………………… 343
Внедрение мутационного тестирования……………………………………………………………………………….. 344
Проблема с показателем покрытия (и другими метриками)…………………………………….. 346
Резюме………………………………………………………………………………………………………………………………………. 347
-
Надежный Python
1000 ₽
850 ₽