УДК 004.94
ББК 32.972
У36
У36 Профессиональная разработка на Python / пер. с англ. А. А. Слинкина. –
М.: ДМК Пресс, 2021. – 502 с.: ил.
Уилкс М.
ISBN 978-5-97060-930-9
В этой книге объясняются языковые средства Python, которые обычно не
рассматриваются в пособиях: от повторно используемых консольных скриптов,
которые одновременно играют роль микросервисов благодаря точкам входа, до
эффективного использования модуля asyncio для объединения данных из различных
источников. Попутно рассматривается проверка соблюдения стандартов
кодирования с по мощью аннотаций типов, тестирование с низкими накладными
расходами и другие автоматизированные проверки качества кода, применяемые
на практике для организации процесса разработки надежного ПО.
Некоторые мощные возможности Python зачастую иллюстрируются на искусственных
примерах, когда то или иное средство описывается в изоляции от
всего остального. Здесь же на примере проектирования и создания реального
приложения от прототипа до готового продукта читатель видит не только, как
работают различные части программы, но и как они интегрируются в процессе
разработки более крупной системы. Кроме того, в книге присутствуют интересные
отступления и рекомендации по использованию библиотек, взятые из сессий вопросов
и ответов на конференциях по Python, а также обсуждение современных
передовых практик и методов, позволяющих создавать ясный и удобный для
сопровождения код.
Эта книга ориентирована на разработчиков, которые уже умеют писать простые
программы на Python и хотят разобраться в том, когда уместно использовать
новые прогрессивные средства языка.
УДК 004.94
ББК 32.972
First published in English under the title Advanced Python Development; Using Powerful
Language Features in RealWorld Applicationsby Matthew Wilkes, edition. This edition has
been translated and published under licence from APress Media, LLC, part of Springer Nature.
APress Media, LLC, part of Springer Nature takes no responsibility and shall not be made liable
for the accuracy of the translation. Russian language edition copyright © 2021 by DMK Press.
All rights reserved.
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой
бы то ни было форме и какими бы то ни было средствами без письменного разрешения
владельцев авторских прав.
ISBN 9781484257920 (англ.)
ISBN 9785970609309 (рус.)
© Matthew Wilkes, 2020
© Оформление, издание, перевод,
ДМК Пресс, 2021
Стр.5
Содержание
От издательства ....................................................................................................12
Об авторе .................................................................................................................13
О технических рецензентах ...........................................................................14
Благодарности ......................................................................................................16
Введение ..................................................................................................................17
Глава 1. Прототипирование и среды разработки ...............................22
Прототипирование в Python ............................................................................22
Прототипирование с по мощью REPL .........................................................23
Прототипирование с по мощью Pythonскрипта ......................................26
Прототипирование с по мощью скриптов и pdb .......................................27
Посмертная отладка ......................................................................................28
Прототипирование с по мощью Jupyter......................................................30
Блокноты ........................................................................................................31
Прототипирование в этой главе .................................................................33
Подготовка окружения .....................................................................................34
Подготовка нового проекта .............................................................................35
Прототипирование скриптов ......................................................................37
Установка зависимостей ..............................................................................40
Экспорт в pyфайл .............................................................................................42
Построение интерфейса командной строки .................................................44
Модуль sys и переменная argv .....................................................................45
argparse ...........................................................................................................47
click ..................................................................................................................48
Окончательный скрипт ....................................................................................58
Резюме.................................................................................................................59
Дополнительные ресурсы ............................................................................59
Глава 2. Тестирование, проверка типов, стандарты
Расширение границ возможного ....................................................................51
Удаленные ядра .............................................................................................51
Разработка кода, который невозможно выполнить локально ...............54
кодирования ..........................................................................................................61
Тестирование .....................................................................................................64
Когда писать тесты ........................................................................................66
Создание функций форматирования для повышения
тестопригодности .........................................................................................67
Стр.6
6 Содержание
pytest ...............................................................................................................70
Автономное, интеграционное и функциональное тестирование .........71
Фикстуры Pytest .............................................................................................74
Покрытие ........................................................................................................78
Проверка типов ..................................................................................................82
Установка mypy ..............................................................................................83
Добавление аннотаций типов .....................................................................83
Подклассы и наследование ..........................................................................86
Обобщенные типы ........................................................................................88
Отладка и чрезмерное увлечение типизацией .........................................90
Когда прибегать к типизации, а когда избегать ее ..................................92
Хранение аннотаций типов отдельно от кода ..........................................93
Стандарты кодирования ...................................................................................95
Установка flake8 и black ................................................................................96
Исправление существующего кода ............................................................96
Автоматический прогон ..............................................................................98
Применение к запросам на включение изменений ................................99
Резюме...............................................................................................................100
Дополнительные ресурсы ..........................................................................102
Глава 3. Скрипты для создания пакетов ................................................103
Терминология ..................................................................................................104
Структура каталога ..........................................................................................105
Скрипты настройки и метаданные...............................................................107
Зависимости .....................................................................................................108
Декларативные конфигурации .....................................................................109
Чего избегать в файле setup.py ..................................................................110
Условные зависимости ...............................................................................110
Файл Readme в метаданных ......................................................................112
Номера версий .............................................................................................114
Использование файла setup.cfg .................................................................115
Специальные серверы каталогов ..................................................................117
Настройка pypiserver ...................................................................................118
Устойчивость к сбоям .................................................................................119
Конфиденциальность .................................................................................120
Целостность..................................................................................................121
Формат wheel и выполнение кода при установке ..................................122
Создание wheelфайлов по существующим дистрибутивам ................123
Установка консольного скрипта с помощью точек входа .........................125
Файлы README, DEVELOP и CHANGES ........................................................126
Формат Markdown .......................................................................................127
Формат reStructured ....................................................................................128
Файл README ..............................................................................................130
Файл CHANGES.md и номера версий .......................................................131
Семантическое версионирование ............................................................131
Календарное версионирование ................................................................132
Закрепление версий зависимостей ..............................................................132
Стр.7
Содержание 7
Слабое закрепление ....................................................................................133
Строгое закрепление ..................................................................................133
Какую схему закрепления использовать .................................................134
Загрузка версии на сервер..............................................................................135
Конфигурирование twine ...........................................................................136
Резюме...............................................................................................................137
Дополнительные ресурсы ..........................................................................137
Глава 4. От скрипта к каркасу ......................................................................139
Написание плагина датчика ..........................................................................140
Разработка плагина.....................................................................................141
Добавление нового параметра командной строки ....................................144
Подкоманды .................................................................................................144
Опции командной строки ..........................................................................147
Обработка ошибок ......................................................................................148
Делегирование разбора аргументов Click ...............................................151
Поддержка Click пользовательских типов аргументов .........................152
Встроенные параметры ..............................................................................154
Разрешение сторонних плагинов датчиков ................................................155
Обнаружение плагинов по фиксированным именам ............................157
Обнаружение плагинов с по мощью точек входа ....................................158
Конфигурационные файлы ........................................................................161
Переменные окружения .............................................................................164
Сравнение apd.sensors с похожими программами ................................165
Резюме...............................................................................................................166
Дополнительные ресурсы ..........................................................................167
Глава 5. Альтернативные интерфейсы ....................................................168
Вебмикросервисы ..........................................................................................168
WSGI ..............................................................................................................169
Проектирование API ...................................................................................174
Аутентификация ..........................................................................................176
Flask ...............................................................................................................176
Декораторы в Python ..................................................................................179
Замыкания ....................................................................................................180
Модификация переменных в родительских областях видимости ......181
Простые декораторы ...................................................................................183
Декораторы с аргументами .......................................................................184
Безопасность на основе декораторов.......................................................186
Тестирование функции представления ...................................................190
Развертывание .............................................................................................192
Расширение программного обеспечения третьей стороной ....................194
Согласование ситуативной сигнатуры с равноправными
пользователями ...........................................................................................199
Абстрактные базовые классы ...................................................................201
Запасные стратегии ....................................................................................204
Стр.8
8 Содержание
Паттерн Адаптер .........................................................................................205
Динамическое генерирование класса ......................................................206
Другие форматы сериализации ................................................................207
Собираем все вместе ...................................................................................209
Исправление ошибки сериализации в нашем коде ...................................211
Наведение порядка .....................................................................................213
Версионирование API .....................................................................................214
Тестопригодность ........................................................................................216
Резюме...............................................................................................................217
Дополнительные ресурсы ..........................................................................218
Глава 6. Процесс агрегирования ................................................................219
Cookiecutter ......................................................................................................219
Создание нового шаблона ..........................................................................220
Создание пакета агрегирования ...................................................................223
Типы баз данных .........................................................................................224
Наш пример .................................................................................................227
Объектнореляционные отображения .....................................................228
Версионирование базы данных ................................................................232
Другие полезные команды alembic ..........................................................236
Загрузка данных ..........................................................................................237
Новые технологии ...........................................................................................244
Базы данных .................................................................................................244
Поведение пользовательских атрибутов .................................................244
Генераторы ...................................................................................................244
Резюме...............................................................................................................245
Дополнительные ресурсы ..........................................................................245
Глава 7. Распараллеливание и асинхронное
программирование...........................................................................................246
Неблокирующий вводвывод.........................................................................247
Делаем код неблокирующим .....................................................................251
Многопоточная и многопроцессная обработка ..........................................253
Низкоуровневые потоки ............................................................................253
Байткод ........................................................................................................257
GIL ..................................................................................................................258
Блокировки и взаимоблокировки ............................................................260
Взаимоблокировки......................................................................................262
Избегайте глобального состояния ............................................................265
Объединение данных .................................................................................265
Передача данных .........................................................................................266
Другие примитивы синхронизации .........................................................269
Реентерабельные блокировки ...................................................................270
Условия..........................................................................................................270
Барьеры .........................................................................................................273
Событие ........................................................................................................274
Стр.9
Содержание 9
Семафор ........................................................................................................275
Объекты ProcessPoolExecutor ....................................................................276
Делаем нашу программу многопоточной ...............................................277
Асинхронный вводвывод ..............................................................................278
async def ........................................................................................................278
await ...............................................................................................................279
async for .........................................................................................................281
async with ......................................................................................................285
Асинхронные примитивы блокировки ....................................................286
Работа совместно с синхронными библиотеками .................................287
Делаем программу асинхронной ..............................................................289
Сравнение .........................................................................................................292
Как сделать выбор ...........................................................................................293
Резюме...............................................................................................................295
Дополнительные ресурсы ..........................................................................295
Глава 8. Дополнительные вопросы асинхронного
ввода-вывода ......................................................................................................296
Тестирование асинхронного кода .................................................................296
Тестирование нашей программы .............................................................298
Тестовые серверы и фикстуры pytest с очисткой ...................................298
Область видимости фикстур ......................................................................302
Использование подставных объектов для упрощения
автономного тестирования .......................................................................305
Подставные объекты с ветвящейся логикой ...........................................308
Классы данных .............................................................................................309
Тестовые методы .........................................................................................312
Асинхронная работа с базами данных .........................................................314
Классический стиль SQLAlchemy ..............................................................315
Неоткомпилированная ...............................................................................316
mssql ..............................................................................................................316
mysql ..............................................................................................................316
Postgresql ......................................................................................................317
sqlite ..............................................................................................................317
Использование метода run_in_executor ...................................................318
Запрос данных .............................................................................................320
Избегайте сложных запросов ....................................................................322
Запросы к представлениям........................................................................329
Альтернативы ..............................................................................................332
Глобальные переменные в асинхронном коде ...........................................333
Резюме...............................................................................................................335
Дополнительные ресурсы ..............................................................................336
Глава 9. Просмотр данных ............................................................................337
Функции запроса .............................................................................................337
Фильтрация данных ....................................................................................343
Стр.10
10 Содержание
Многоуровневые итераторы .....................................................................345
Дополнительные фильтры .........................................................................351
Тестирование функций запроса ................................................................352
Параметрические тесты .............................................................................354
Отображение нескольких датчиков ..............................................................355
Обработка данных ...........................................................................................359
Интерактивная работа с виджетами Jupyter ...............................................363
Глубоко вложенный синхронный и асинхронный коды .......................364
Наведем порядок .........................................................................................369
Сохранение оконечных точек ........................................................................370
Нанесение географических данных на карты .............................................371
Новые типы графиков ................................................................................373
Поддержка карт в пакете apd.aggregation................................................375
Обратная совместимость в классах данных ............................................376
Построение карты с применением новых конфигурационных
объектов ........................................................................................................378
Резюме...............................................................................................................380
Дополнительные ресурсы ..........................................................................381
Глава 10. Повышение быстродействия ..................................................382
Оптимизация функции...................................................................................382
Профилирование и потоки ........................................................................384
Интерпретация отчета профилировщика ...............................................387
Другие профилировщики ..........................................................................389
timeit .............................................................................................................389
line_profiler ...................................................................................................390
yappi ..............................................................................................................390
Tracemalloc ...................................................................................................393
New Relic .......................................................................................................394
Оптимизация потока управления ................................................................395
Сложность .....................................................................................................395
Визуализация данных профилирования .................................................399
Кеширование ...............................................................................................402
Кешированные свойства ............................................................................409
Резюме...............................................................................................................411
Дополнительные ресурсы ..........................................................................411
Глава 11. Отказоустойчивость .....................................................................413
Обработка ошибок ...........................................................................................413
Получение элементов из контейнера ......................................................414
Абстрактные базовые классы ....................................................................414
Типы исключений .......................................................................................417
Пользовательские исключения .................................................................419
Создание новых типов исключений .........................................................420
Дополнительные метаданные ...................................................................422
Трасса вызовов при наличии нескольких исключений ........................423
Стр.11
Содержание 11
Исключение в блоке except или finally .....................................................424
raise from .......................................................................................................425
Тестирование обработки исключений .....................................................427
Новые поведения ........................................................................................427
Еще о подставных объектах и unittest.Mock ...........................................430
Предупреждения ..............................................................................................432
Фильтры предупреждений.........................................................................435
Протоколирование ..........................................................................................437
Вложенные регистраторы ..........................................................................438
Пользовательские действия .......................................................................439
Дополнительные метаданные ...................................................................440
Конфигурация протоколирования ...........................................................445
Другие обработчики....................................................................................446
Контрольные журналы ...............................................................................446
Избегание проблем на этапе проектирования ...........................................447
Опрос датчиков по расписанию ...............................................................448
API и фильтрация ........................................................................................451
Резюме...............................................................................................................452
Дополнительные ресурсы ..........................................................................453
Глава 12. Обратные вызовы и анализ данных ...................................454
Поток данных генератора ..............................................................................454
Генераторы, потребляющие свой собственный выход ..........................456
Улучшенные генераторы ............................................................................459
Использование классов ..............................................................................462
Использование улучшенного генератора для обертывания
итерируемого объекта ................................................................................463
Рефакторинг функций, возвращающих излишние значения ..............464
Очереди ........................................................................................................466
Выбор потока управления .........................................................................468
Конструкция для наших действий ................................................................469
Сопрограммы для анализа .........................................................................470
Подача данных .............................................................................................475
Выполнение процесса анализа .................................................................478
Состояния процесса ........................................................................................480
Обратные вызовы........................................................................................483
Расширение состава имеющихся действий .................................................485
Резюме...............................................................................................................488
Дополнительные ресурсы ..........................................................................488
Эпилог .....................................................................................................................490
Предметный указатель ...................................................................................492
Стр.12