УДК 004.438Python
ББК 32.973.22
Б59
Б59 Python. Книга рецептов / пер. с анг. Б. В. Уварова. – М.: ДМК Пресс, 2019. –
648 с.: ил.
Бизли Д., Джонс Б. К.
ISBN 978-5-97060-751-0
Книга, которую вы держите в руках, даст четкое понимание, как именно стоит
писать приложения на Python, чтобы не пришлось раз за разом их переделывать
и они были удобны для работы. Это наиболее полное и систематичное руководство
по Python, в нем разобраны самые популярные подходы для создания легкочитаемого,
оптимизированного и поддерживаемого кода. Также приведены примеры
применения полученных знаний в прикладных областях, все главы сопровождаются
конкретными заданиями.
Издание будет полезно как начинающим разработчикам, так и опытным специалистам.
УДК
004.438Python
ББК 32.973.22
Original English language edition published by O’Reilly Media, Inc., 1005 Gravenstein Highway
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой
North, Sebastopol, CA 95472. Copyright © 2013 David Beazley and Brian Jones. Russianlanguage
edition copyright © 2019 by DMK Press. All rights reserved.
бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев
авторских прав.
ISBN 9781449340377 (анг.)
ISBN 9785970607510 (рус.)
Copyright © 2013 David Beazley and Brian Jones
© Оформление, издание, перевод, ДМК Пресс, 2019
Стр.5
Содержание
Предисловие ................................................................................................................. 12
Благодарности .............................................................................................................. 16
Об авторе ....................................................................................................................... 17
Колофон .......................................................................................................................... 18
Вступительное слово .................................................................................................. 19
Глава 1. Структуры данных и алгоритмы ............................................................ 20
1.1. Распаковка последовательности в отдельные переменные ................................... 20
1.2. Распаковка элементов из последовательностей произвольной длины ................. 22
1.3. Оставляем N последних элементов .......................................................................... 24
1.4. Поиск N максимальных и минимальных элементов .............................................. 26
1.5. Реализация очереди с приоритетом ......................................................................... 27
1.6. Отображение ключей на несколько значений в словаре ........................................ 30
1.7. Поддержание порядка в словарях ............................................................................. 31
1.8. Вычисления со словарями ......................................................................................... 32
1.9. Поиск общих элементов в двух словарях ................................................................. 34
1.10. Удаление дубликатов из последовательности с сохранением порядка
элементов .......................................................................................................................... 35
1.11. Присваивание имен срезам .................................................................................... 36
1.12. Определение наиболее часто встречающихся элементов
в последовательности ....................................................................................................... 38
1.13. Сортировка списка словарей по общему ключу .................................................... 40
1.14. Сортировка объектов, не поддерживающих сравнение ....................................... 41
1.15. Группирование записей на основе полей .............................................................. 42
1.16. Фильтрование элементов последовательности ..................................................... 44
1.17. Извлечение подмножества из словаря ................................................................... 46
1.18. Отображение имен на последовательность элементов ........................................ 47
1.19. Одновременное преобразование и сокращение (свертка) данных ..................... 50
1.20. Объединение нескольких отображений в одно ..................................................... 51
Глава 2. Строки и текст ............................................................................................... 54
2.1. Разрезание строк различными разделителями ....................................................... 54
2.2. Поиск текста в начале и в конце строки ................................................................... 55
2.3. Поиск строк с использованием масок оболочки (shell) ........................................... 57
2.4. Поиск совпадений и поиск текстовых паттернов .................................................... 58
2.5. Поиск и замена текста ............................................................................................... 61
2.6. Поиск и замена текста без учета регистра ............................................................... 63
2.7. Определение регулярных выражений для поиска кратчайшего совпадения ........ 64
2.8. Написание регулярного выражения для многострочных шаблонов ...................... 65
2.9. Нормализация текста в Unicode к стандартному представлению .......................... 66
2.10. Использование символов Unicode в регулярных выражениях ............................. 68
Стр.6
6 Содержание
2.11. Срезание нежелательных символов из строк ........................................................ 69
2.12. Чистка строк ............................................................................................................. 70
2.13. Выравнивание текстовых строк .............................................................................. 73
2.14. Объединение и конкатенация строк....................................................................... 74
2.15. Интерполяция переменных в строках .................................................................... 77
2.16. Разбивка текста на фиксированное количество колонок ..................................... 79
2.17. Работа с HTML и XMLсущностями в тексте .......................................................... 80
2.18. Токенизация текста .................................................................................................. 82
2.19. Написание простого парсера на основе метода рекурсивного спуска................. 84
2.20. Выполнение текстовых операций над байтовыми строками ............................... 93
Глава 3. Числа, даты и время .................................................................................. 97
3.1. Округление числовых значений ............................................................................... 97
3.2. Выполнение точных вычислений с десятичными дробями ................................... 98
3.3. Форматирование чисел для вывода ........................................................................ 100
3.4. Работа с бинарными, восьмеричными и шестнадцатеричными целыми
числами ........................................................................................................................... 102
3.5. Упаковка и распаковка больших целых чисел из байтовых строк ....................... 104
3.6. Вычисления с комплексными числами .................................................................. 105
3.7. Работа с бесконечными значениями и NaN ........................................................... 107
3.8. Вычисления с дробями ............................................................................................ 109
3.9. Вычисления на больших массивах чисел ............................................................... 110
3.10. Вычисления с матрицами и линейная алгебра .................................................... 113
3.11. Случайный выбор ................................................................................................... 115
3.12. Перевод дней в секунды и другие базовые методы конвертации времени ...... 117
3.13. Определение даты последней пятницы ............................................................... 119
3.14. Поиск диапазона дат для текущего месяца .......................................................... 120
3.15. Конвертирование строк в даты и время ............................................................... 122
3.16. Манипулирование датами с учетом временных зон ........................................... 123
Глава 4. Итераторы и генераторы ....................................................................... 126
4.1. Ручное прохождение по итератору ......................................................................... 126
4.2. Делегирование итерации ........................................................................................ 127
4.3. Создание новых итерационных паттернов с помощью генераторов .................. 128
4.4. Реализация протокола итератора ........................................................................... 130
4.5. Итерирование в обратном порядке ........................................................................ 132
4.6. Определение генератора с дополнительным состоянием .................................... 133
4.7. Получение среза итератора ..................................................................................... 134
4.8. Пропуск первой части итерируемого объекта ....................................................... 135
4.9. Итерирование по всем возможным комбинациям и перестановкам .................. 137
4.10. Итерирование по парам «индекс–значение» последовательности ................... 139
4.11. Одновременное итерирование по нескольким последовательностям .............. 141
4.12. Итерирование по элементам, находящимся в отдельных контейнерах ............ 143
4.13. Создание каналов для обработки данных ............................................................ 144
4.14. Превращение вложенной последовательности в плоскую ................................. 147
4.15. Последовательное итерирование по слитым отсортированным
итерируемым объектам ................................................................................................. 149
4.16. Замена бесконечных циклов while итератором ................................................... 150
Стр.7
Содержание 7
Глава 5. Файлы и ввод-вывод ............................................................................... 152
5.1. Чтение и запись текстовых данных ........................................................................ 152
5.2. Перенаправление вывода в файл ............................................................................ 154
5.3. Вывод с другим разделителем или символом конца строки ................................ 155
5.4. Чтение и запись бинарных данных ........................................................................ 156
5.5. Запись в файл, которого еще нет ............................................................................ 158
5.6. Выполнение операций вводавывода над строками ............................................. 159
5.7. Чтение и запись сжатых файлов с данными .......................................................... 160
5.8. Итерирование по записям фиксированного размера ........................................... 161
5.9. Чтение бинарных данных в изменяемый (мутабельный) буфер ......................... 162
5.10. Отображаемые в память бинарные файлы .......................................................... 163
5.11. Манипулирование путями к файлам .................................................................... 166
5.12. Проверка существования файла ........................................................................... 167
5.13. Получение содержимого каталога ........................................................................ 168
5.14. Обход кодировки имен файлов ............................................................................. 169
5.15. Вывод «плохих» имен файлов ............................................................................... 170
5.16. Добавление или изменение кодировки уже открытого файла ........................... 172
5.17. Запись байтов в текстовый файл ........................................................................... 174
5.18. Оборачивание существующего дескриптора файла для использования
в качестве объекта файла ............................................................................................... 175
5.19. Создание временных файлов и каталогов ........................................................... 177
5.20. Работа с последовательными портами ................................................................. 179
5.21. Сериализация объектов Python ............................................................................. 180
Глава 6. Кодирование и обработка данных ..................................................... 184
6.1. Чтение и запись данных в формате CSV ................................................................ 184
6.2. Чтение и запись в формате JSON ............................................................................ 187
6.3. Парсинг простых XMLданных ................................................................................ 192
6.4. Пошаговый парсинг очень больших XMLфайлов ................................................. 194
6.5. Преобразование словарей в XML ............................................................................ 198
6.6. Парсинг, изменение и перезапись XML ................................................................. 199
6.7. Парсинг XMLдокументов с пространствами имен ............................................... 201
6.8. Взаимодействие с реляционной базой данных ..................................................... 203
6.9. Декодирование и кодирование шестнадцатеричных цифр ................................. 206
6.10. Кодирование и декодирование в Base64 .............................................................. 207
6.11. Чтение и запись бинарных массивов структур .................................................... 208
6.12. Чтение вложенных и различных по размеру бинарных структур ...................... 212
6.13. Суммирование данных и обсчет статистики ....................................................... 222
Глава 7. Функции ........................................................................................................ 225
7.1. Определение функций, принимающих любое количество аргументов ............... 225
7.2. Определение функций, принимающих только именованные аргументы ........... 226
7.3. Прикрепление информационных метаданных к аргументам функций .............. 227
7.4. Возвращение функцией нескольких значений ...................................................... 228
7.5. Определение функций с аргументами по умолчанию .......................................... 229
7.6. Определение анонимных функций или встроенных функций (inline) ................ 232
7.7. Захват переменных в анонимных функциях .......................................................... 233
7.8. Заставляем вызываемый объект с N аргументами работать так же,
как вызываемый объект с меньшим количеством аргументов .................................. 234
Стр.8
8 Содержание
7.9. Замена классов с одним методом функциями ....................................................... 238
7.10. Передача дополнительного состояния с функциями обратного вызова ........... 239
7.11. Встроенные функции обратного вызова .............................................................. 242
7.12. Доступ к переменным, определенным внутри замыкания ................................. 245
Глава 8. Классы и объекты ..................................................................................... 248
8.1. Изменение строкового представления экземпляров ............................................ 248
8.2. Настройка строкового форматирования ................................................................ 249
8.3. Создание объектов, поддерживающих протокол менеджера контекста ............. 251
8.4. Экономия памяти при создании большого количества экземпляров ................. 253
8.5. Инкапсуляция имен в классе ................................................................................... 254
8.6. Создание управляемых атрибутов .......................................................................... 256
8.7. Вызов метода родительского класса ....................................................................... 260
8.8. Расширение свойства в подклассе .......................................................................... 264
8.9. Создание нового типа атрибута класса или экземпляра ...................................... 268
8.10. Использование лениво вычисляемых свойств ..................................................... 271
8.11. Упрощение инициализации структур данных ..................................................... 274
8.12. Определение интерфейса или абстрактного базового класса ............................ 277
8.13. Реализации модели данных или системы типов ................................................. 280
8.14. Реализация собственных контейнеров ................................................................ 286
8.15. Делегирование доступа к атрибуту ....................................................................... 290
8.16. Определение более одного конструктора в классе .............................................. 294
8.17. Создание экземпляра без вызова init ................................................................... 295
8.18. Расширение классов с помощью миксин (mixins) ............................................... 297
8.19. Реализация объектов с состоянием или конечных автоматов ........................... 302
8.20. Вызов метода объекта с передачей имени метода в строке ............................... 307
8.21. Реализация шаблона проектирования «Посетитель» .......................................... 309
8.22. Реализация шаблона «Посетитель» без рекурсии ................................................ 313
8.23. Управление памятью в циклических структурах данных ................................... 319
8.24. Заставляем классы поддерживать операции сравнения ..................................... 323
8.25. Создание закешированных экземпляров ............................................................. 325
Глава 9. Метапрограммирование ........................................................................ 329
9.1. Создание обертки для функции .............................................................................. 329
9.2. Сохранение метаданных функции при написании декораторов ......................... 331
9.3. Снятие («разворачивание») декоратора ................................................................. 332
9.4. Определение декоратора, принимающего аргументы ......................................... 334
9.5. Определение декоратора с настраиваемыми пользователем атрибутами ......... 335
9.6. Определение декоратора, принимающего необязательный аргумент ................ 338
9.7. Принудительная проверка типов в функции с использованием декоратора ...... 340
9.8. Определение декораторов как части класса .......................................................... 344
9.9. Определение декораторов как классов .................................................................. 346
9.10. Применение декораторов к методам класса и статическим методам ............... 348
9.11. Написание декораторов, которые добавляют аргументы обернутым
функциям ........................................................................................................................ 350
9.12. Использование декораторов для исправления определений классов ............... 353
9.13. Использование метакласса для управления созданием экземпляров ............... 355
9.14. Захват порядка определения атрибутов класса ................................................... 357
9.15. Определение метакласса, принимающего необязательные аргументы ............ 360
Стр.9
Содержание 9
9.16. Принудительная установка аргументной сигнатуры при использовании
*args и **kwargs ............................................................................................................... 362
9.17. Принуждение к использованию соглашений о кодировании в классах ............. 365
9.18. Программное определение классов ...................................................................... 368
9.19. Инициализация членов класса во время определения ....................................... 371
9.20. Реализация множественной диспетчеризации с помощью аннотаций
функций .......................................................................................................................... 373
9.21. Избежание повторяющихся методов свойств ...................................................... 379
9.22. Легкий способ определения менеджеров контекста ........................................... 381
9.23. Выполнение кода с локальными побочными эффектами .................................. 383
9.24. Парсинг и анализ исходного кода Python............................................................. 385
9.25. Дизассемблирование байткода Python ............................................................... 389
Глава 10. Модули и пакеты .................................................................................... 393
10.1. Создание иерархического пакета модулей .......................................................... 393
10.2. Контроль импортирования.................................................................................... 394
10.3. Импортирование подмодулей пакета с использованием относительных
имен ................................................................................................................................. 395
10.4. Разделение модуля на несколько файлов ............................................................. 397
10.5. Создание отдельных каталогов с кодом для импорта под общим
пространством имен ...................................................................................................... 399
10.6. Перезагрузка модулей ........................................................................................... 401
10.7. Создание каталога или zipархива, запускаемых как основной скрипт ............ 402
10.8. Чтение файлов с данными внутри пакета ............................................................ 403
10.9. Добавление каталогов в sys.path ........................................................................... 404
10.10. Импортирование модулей с использованием имени, передаваемого
в форме строки .............................................................................................................. 406
10.11. Загрузка модулей с удаленного компьютера с использованием хуков
импортирования ............................................................................................................. 407
10.12. Применение к модулям изменений при импорте ............................................. 423
10.13. Установка пакетов «только для себя» .................................................................. 426
10.14. Создание нового окружения Python ................................................................... 426
10.15. Распространение пакетов .................................................................................... 428
Глава 11. Сети и веб-программирование ......................................................... 430
11.1. Взаимодействие с HTTPсервисами в роли клиента ........................................... 430
11.2. Создание TCPсервера ........................................................................................... 434
11.3. Создание UDPсервера ........................................................................................... 437
11.4. Генерация диапазона IPадресов из CIDRадреса ............................................... 439
11.5. Создание простого RESTинтерфейса .................................................................. 441
11.6. Реализация простого удаленного вызова процедуры через XMLRPC .............. 446
11.7. Простое взаимодействие между интерпретаторами ........................................... 448
11.8. Реализация удаленного вызова процедур ............................................................ 450
11.9. Простая аутентификация клиентов ...................................................................... 453
11.10. Добавление SSL в сетевые сервисы ..................................................................... 455
11.11. Передача файловых дескрипторов сокетов между процессами ....................... 461
11.12. Разбираемся с вводомвыводом, управляемым событиями (eventdriven I/0) ..... 466
11.13. Отсылка и получение больших массивов ........................................................... 472
Стр.10
10 Содержание
Глава 12. Конкурентность ....................................................................................... 475
12.1. Запуск и остановка потоков .................................................................................. 475
12.2. Как узнать, стартовал ли поток ............................................................................. 478
12.3. Коммуникация между потоками .......................................................................... 481
12.4. Блокировка критически важных участков ........................................................... 486
12.5. Блокировка с избежанием дедлока ....................................................................... 489
12.6. Хранение специфичного состояния потока ......................................................... 493
12.7. Создание пула потоков .......................................................................................... 495
12.8. Простое параллельное программирование ......................................................... 498
12.9. Разбираемся с GIL (и перестаем волноваться по этому поводу) ........................ 502
12.10. Определение акторной задачи ............................................................................ 505
12.11. Реализация системы сообщений «опубликовать/подписаться» (pub/sub) ....... 509
12.12. Использование генераторов в качестве альтернативы потокам ...................... 512
12.13. Опрашивание многопоточных очередей ........................................................... 520
12.14. Запуск процессадемона на Unix......................................................................... 523
Глава 13. Полезные скрипты и системное администрирование .............. 527
13.1. Скрипты, принимающие ввод через перенаправление, каналы или файлы .... 527
13.2. Завершение программы с выводом сообщения об ошибке ................................ 528
13.3. Парсинг аргументов командной строки ............................................................... 529
13.4. Запрос пароля во время выполнения ................................................................... 532
13.5. Получение размера окна терминала .................................................................... 532
13.6. Выполнение внешней команды и получение ее вывода ..................................... 533
13.7. Копирование или перемещение файлов и каталогов .......................................... 535
13.8. Создание и распаковка архивов ............................................................................ 537
13.9. Поиск файлов по имени......................................................................................... 537
13.10. Чтение конфигурационных файлов .................................................................... 539
13.11. Добавление логирования в простые скрипты .................................................... 542
13.12. Добавление логирования в библиотеки ............................................................. 545
13.13. Создание таймерасекундомера ......................................................................... 546
13.14. Установка лимитов на использование памяти и CPU ........................................ 548
13.15. Запуск браузера .................................................................................................... 549
Глава 14. Тестирование, отладка и исключения ............................................. 551
14.1. Тестирование отправки вывода в stdout .............................................................. 551
14.2. Изменение объектов в юниттестах ..................................................................... 552
14.3. Проверка вызывающих исключения условий в рамках юниттестов ................ 556
14.4. Логирование вывода теста в файл ........................................................................ 557
14.5. Пропуск или ожидание провалов тестов .............................................................. 559
14.6. Обработка множественных исключений.............................................................. 560
14.7. Ловим все исключения ........................................................................................... 562
14.8. Создание собственных исключений ..................................................................... 563
14.9. Возбужение исключения в ответ на другое исключение..................................... 565
14.10. Повторное возбуждение последнего исключения ............................................. 567
14.11. Вывод предупреждающих сообщений ................................................................ 568
14.12. Отладка основных сбоев программы ................................................................. 569
14.13. Профилирование и замеры времени выполнения вашей программы ............ 572
14.14. Заставляем ваши программы выполняться быстрее ......................................... 574
Стр.11
Содержание 11
Глава 15. Расширения на языке C ........................................................................ 580
15.1. Доступ к коду на C с использованием ctypes........................................................ 581
15.2. Написание простого модуля расширения на C .................................................... 588
15.3. Написание функции расширения для работы с массивами ............................... 592
15.4. Управление непрозрачными указателями в модулях расширения на C ........... 594
15.5. Определение и экспортирование С API из модулей расширения ...................... 597
15.6. Вызываем Python из С ........................................................................................... 601
15.7. Освобождение GIL в расширениях на C ................................................................ 607
15.8. Объединение потоков из C и Python .................................................................... 607
15.9. Оборачивание кода на C в Swig ............................................................................. 608
15.10. Оборачивание существующего кода на C в Cython ........................................... 613
15.11. Использование Cython для высокопроизводительных операций
над массивами ................................................................................................................ 620
15.12. Превращение указателя на функцию в вызываемый объект............................ 624
15.13. Передача строк с нулевым символом библиотекам на C .................................. 626
15.14. Передача строк Unicode в библиотеки на C ........................................................ 630
15.15. Преобразование строк C в Python ....................................................................... 634
15.16. Работа со строками C в сомнительной кодировке ............................................. 635
15.17. Передача имен файлов в расширения на С ........................................................ 638
15.18. Передача открытых файлов в расширения на С ................................................ 639
15.19. Чтение файлоподобных объектов из C ............................................................... 641
15.20. Потребление итерируемого объекта из С ........................................................... 643
15.21. Диагностика ошибок сегментации ..................................................................... 644
Приложение А. Для дальнейшего изучения .................................................... 646
Вебсайты ........................................................................................................................ 646
Книги, посвященные языку Python ............................................................................... 647
Книги для углубленного изучения Python .................................................................... 647
Стр.12