Предисловие................................................................................................................. 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 Содержание
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
Глава 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 Содержание
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.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. Реализация простого удаленного вызова процедуры через XML-RPC .............. 446
11.7. Простое взаимодействие между интерпретаторами........................................... 448
11.8. Реализация удаленного вызова процедур............................................................ 450
11.9. Простая аутентификация клиентов...................................................................... 453
11.10. Добавление SSL в сетевые сервисы..................................................................... 455
11.11. Передача файловых дескрипторов сокетов между процессами....................... 461
11.12. Разбираемся с вводом-выводом, управляемым событиями (event-driven I/0)..... 466
11.13. Отсылка и получение больших массивов........................................................... 472
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
Глава 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