Опубликовано

Представляем новинку: “Надежный Python”

Надежный Python

Современные проекты на языке 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

Добавить комментарий