Python - к вершинам мастерства: Лаконичное и эффективное программирование
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Рамальо Лусиану
Перевод:
Слинкин Алексей Александрович
Год издания: 2022
Кол-во страниц: 898
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Профессиональное образование
ISBN: 978-5-97060-885-2
Артикул: 817277.01.99
Не тратьте зря времени, пытаясь подогнать Python под способы программирования, знакомые вам по другим языкам. Python настолько прост, что вы очень быстро станете продуктивным программистом, но зачастую это означает, что вы не в полной мере используете то, что может предложить язык. Второе издание книги позволит вам писать более эффективный и современный код на Python 3, обратив себе на пользу лучшие идеи.
Издание предназначено практикующим программистам на Python, которыехотят усовершенствоваться в Python 3.
- Полная коллекция по информатике и вычислительной технике
- Аналитика данных
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для обучающихся
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для обучающихся (сводная)
- Программирование и алгоритмизация
- Программирование на Python
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Лусиану Рамальо Python – к вершинам мастерства Лаконичное и эффективное программирование
Fluent Python Clear, Concise, and Effective Programming Luciano Ramalho Second edition
Python – к вершинам мастерства Лаконичное и эффективное программирование Лусиану Рамальо Москва, 2022 Второе издание
УДК 004.438Python:004.6 ББК 32.973.22 Р21 Лусиану Рамальо Р21 Python – к вершинам мастерства: Лаконичное и эффективное программирование / пер. с англ. А. А. Слинкина. 2-е изд. – М.: МК Пресс, 2022. – 898 с.: ил. ISBN 978-5-97060-885-2 Не тратьте зря времени, пытаясь подогнать Python под способы программирования, знакомые вам по другим языкам. Python настолько прост, что вы очень быстро станете продуктивным программистом, но зачастую это означает, что вы не в полной мере используете то, что может предложить язык. Второе издание книги позволит вам писать более эффективный и современный код на Python 3, обратив себе на пользу лучшие идеи. Издание предназначено практикующим программистам на Python, которые хотят усовершенствоваться в Python 3. УДК 004.438Python:004.6 ББК 32.973.22 Authorized Russian translation of the English edition of Fluent Python, 2nd Edition ISBN 9781492056355 © 2021 Luciano Gama de Sousa Ramalho. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Copyright © 2021 Luciano Ramalho © Оформление, издание, перевод, ДМК Пресс, 2022 ISBN (анг.) 978-1-49205-635-5 ISBN (рус.) 978-5-97060-885-2
Марте, с любовью
Оглавление Предисловие от издательства ........................................................ 19 Отзывы и пожелания ........................................................................................19 Список опечаток ...............................................................................................19 Нарушение авторских прав .............................................................................19 Об авторе ........................................................................................... 20 Колофон ............................................................................................. 20 Предисловие ...................................................................................... 21 На кого рассчитана эта книга ..........................................................................21 На кого эта книга не рассчитана .....................................................................22 Пять книг в одной .............................................................................................22 Как организована эта книга .............................................................................22 Практикум .........................................................................................................24 Поговорим: мое личное мнение ......................................................................25 Сопроводительный сайт: fluentpython.com ....................................................25 Графические выделения ..................................................................................25 О примерах кода ...............................................................................................26 Как с нами связаться ........................................................................................26 Благодарности ..................................................................................................27 Благодарности к первому изданию .................................................................28 ЧАСТЬ I. СТРУКТУРЫ ДАННЫХ ........................................31 Глава 1. Модель данных в языке Python ...................................... 32 Что нового в этой главе ....................................................................................33 Колода карт на Python ......................................................................................33 Как используются специальные методы ........................................................36 Эмуляция числовых типов ...........................................................................37 Строковое представление ............................................................................40 Булево значение пользовательского типа ..................................................41 API коллекций ...............................................................................................41 Сводка специальных методов .........................................................................43 Почему len – не метод ......................................................................................45 Резюме ...............................................................................................................45 Дополнительная литература ............................................................................46
Глава 2. Массив последовательностей .......................................... 48 Что нового в этой главе ....................................................................................49 Общие сведения о встроенных последовательностях ...................................49 Списковое включение и генераторные выражения .......................................51 Списковое включение и удобочитаемость .................................................52 Сравнение спискового включения с map и filter ........................................53 Декартовы произведения ............................................................................54 Генераторные выражения ............................................................................55 Кортеж – не просто неизменяемый список ....................................................57 Кортежи как записи ......................................................................................57 Кортежи как неизменяемые списки ...........................................................58 Сравнение методов кортежа и списка ........................................................60 Распаковка последовательностей и итерируемых объектов .........................61 Распаковка с помощью * в вызовах функций и литеральных последовательностях ....................................................................................63 Распаковка вложенных объектов ................................................................63 Сопоставление с последовательностями-образцами ....................................64 Сопоставление с последовательностями-образцами в интерпретаторе .........................................................................................69 Получение среза ...............................................................................................72 Почему в срезы и диапазоны не включается последний элемент ............73 Объекты среза ...............................................................................................73 Многомерные срезы и многоточие .............................................................74 Присваивание срезу .....................................................................................75 Использование + и * для последовательностей ..............................................76 Построение списка списков .........................................................................76 Составное присваивание последовательностей .............................................78 Головоломка: присваивание A += ...............................................................79 Метод list.sort и встроенная функция sorted ..................................................81 Когда список не подходит ................................................................................83 Массивы ........................................................................................................83 Представления областей памяти .................................................................86 NumPy ............................................................................................................88 Двусторонние и другие очереди ..................................................................90 Резюме ...............................................................................................................93 Дополнительная литература ............................................................................94 Глава 3. Словари и множества ......................................................... 99 Что нового в этой главе ....................................................................................99 Современный синтаксис словарей ................................................................100 Словарные включения ...............................................................................100 Распаковка отображений ...........................................................................101 Объединение отображений оператором | .................................................102 Сопоставление с отображением-образцом ..................................................102 Стандартный API типов отображений ..........................................................105 Что значит «хешируемый»? .......................................................................105 Обзор наиболее употребительных методов отображений ......................106 Оглавление 7
Вставка и обновление изменяемых значений .........................................108 Автоматическая обработка отсутствующих ключей ...................................111 defaultdict: еще один подход к обработке отсутствия ключа ..................111 Метод __missing__ ........................................................................................112 Несогласованное использование __missing__ в стандартной библиотеке .........................................................................114 Вариации на тему dict ....................................................................................115 collections.OrderedDict ................................................................................115 collections.ChainMap ...................................................................................116 collections.Counter ......................................................................................117 shelve.Shelf ..................................................................................................117 Создание подкласса UserDict вместо dict..................................................118 Неизменяемые отображения .........................................................................120 Представления словаря ..................................................................................121 Практические последствия внутреннего устройства класса dict ................122 Теория множеств ............................................................................................123 Литеральные множества ............................................................................125 Множественное включение .......................................................................126 Практические последствия внутреннего устройства класса set .................126 Операции над множествами......................................................................127 Теоретико-множественные операции над представлениями словарей ....129 Резюме .............................................................................................................131 Дополнительная литература ..........................................................................132 Глава 4. Unicode-текст и байты .....................................................135 Что нового в этой главе ..................................................................................136 О символах, и не только .................................................................................136 Все, что нужно знать о байтах .......................................................................137 Базовые кодировщики и декодировщики ....................................................140 Проблемы кодирования и декодирования ...................................................141 Обработка UnicodeEncodeError ..................................................................142 Обработка UnicodeDecodeError ..................................................................143 Исключение SyntaxError при загрузке модулей с неожиданной кодировкой .......................................................................144 Как определить кодировку последовательности байтов .........................145 BOM: полезный крокозябр .........................................................................146 Обработка текстовых файлов ........................................................................147 Остерегайтесь кодировок по умолчанию .................................................150 Нормализация Unicode для надежного сравнения ......................................155 Сворачивание регистра ..............................................................................158 Служебные функции для сравнения нормализованного текста .............158 Экстремальная «нормализация»: удаление диакритических знаков .....159 Сортировка Unicode-текстов ..........................................................................162 Сортировка с помощью алгоритма упорядочивания Unicode ................164 База данных Unicode .......................................................................................165 Поиск символов по имени .........................................................................165 Символы, связанные с числами.................................................................167 8 Оглавление
Двухрежимный API .........................................................................................168 str и bytes в регулярных выражениях ........................................................168 str и bytes в функциях из модуля os ..........................................................170 Резюме .............................................................................................................170 Дополнительная литература ..........................................................................171 Глава 5. Построители классов данных .........................................176 Что нового в этой главе ..................................................................................177 Обзор построителей классов данных ............................................................177 Основные возможности .............................................................................179 Классические именованные кортежи ...........................................................181 Типизированные именованные кортежи .....................................................184 Краткое введение в аннотации типов ...........................................................185 Никаких последствий во время выполнения ...........................................185 Синтаксис аннотаций переменных ..........................................................186 Семантика аннотаций переменных ..........................................................186 Инспекция typing.NamedTuple ..................................................................187 Инспектирование класса с декоратором dataclass ...................................188 Еще о @dataclass ............................................................................................190 Опции полей ...............................................................................................191 Постинициализация ...................................................................................194 Типизированные атрибуты класса ............................................................196 Инициализируемые переменные, не являющиеся полями ....................196 Пример использования @dataclass: запись о ресурсе из дублинского ядра ...................................................................................197 Класс данных как признак кода с душком ....................................................199 Класс данных как временная конструкция ..............................................201 Класс данных как промежуточное представление ..................................201 Сопоставление с экземплярами классов – образцами ................................201 Простые классы-образцы ...........................................................................202 Именованные классы-образцы .................................................................202 Позиционные классы-образцы .................................................................204 Резюме .............................................................................................................205 Дополнительная литература ..........................................................................205 Глава 6. Ссылки на объекты, изменяемость и повторное использование..........................................................209 Что нового в этой главе ..................................................................................210 Переменные – не ящики ................................................................................210 Тождественность, равенство и псевдонимы .................................................212 Выбор между == и is ....................................................................................213 Относительная неизменяемость кортежей ..............................................214 По умолчанию копирование поверхностное ................................................215 Глубокое и поверхностное копирование произвольных объектов .........218 Параметры функций как ссылки ...................................................................219 Значения по умолчанию изменяемого типа: неудачная мысль .............220 Защитное программирование при наличии изменяемых параметров ....222 Оглавление 9
del и сборка мусора .........................................................................................224 Как Python хитрит с неизменяемыми объектами ........................................226 Резюме .............................................................................................................228 Дополнительная литература ..........................................................................229 ЧАСТЬ II. ФУНКЦИИ КАК ОБЪЕКТЫ .............................233 Глава 7. Функции как полноправные объекты ...........................234 Что нового в этой главе ..................................................................................235 Обращение с функцией как с объектом ........................................................235 Функции высшего порядка ............................................................................236 Современные альтернативы функциям map, filter и reduce ....................237 Анонимные функции .....................................................................................239 Девять видов вызываемых объектов ............................................................240 Пользовательские вызываемые типы ...........................................................241 От позиционных к чисто именованным параметрам .................................242 Чисто позиционные параметры ................................................................244 Пакеты для функционального программирования .....................................245 Модуль operator ..........................................................................................245 Фиксация аргументов с помощью functools.partial .................................248 Резюме .............................................................................................................250 Дополнительная литература ..........................................................................250 Глава 8. Аннотации типов в функциях .........................................254 Что нового в этой главе ..................................................................................255 О постепенной типизации .............................................................................255 Постепенная типизация на практике ...........................................................256 Начинаем работать с Mypy .........................................................................257 А теперь построже ......................................................................................258 Значение параметра по умолчанию .........................................................258 None в качестве значения по умолчанию .................................................260 Типы определяются тем, какие операции они поддерживают ...................261 Типы, пригодные для использования в аннотациях....................................266 Тип Any ........................................................................................................266 «Является подтипом» и «совместим с» .....................................................267 Простые типы и классы ..............................................................................269 Типы Optional и Union ................................................................................269 Обобщенные коллекции ............................................................................270 Типы кортежей ...........................................................................................273 Обобщенные отображения ........................................................................275 Абстрактные базовые классы ....................................................................276 Тип Iterable ..................................................................................................278 Параметризованные обобщенные типы и TypeVar .................................280 Статические протоколы .............................................................................284 Тип Callable .................................................................................................288 Тип NoReturn...............................................................................................291 Аннотирование чисто позиционных и вариадических параметров ..........291 10 Оглавление
Несовершенная типизация и строгое тестирование ...................................292 Резюме .............................................................................................................293 Дополнительная литература ..........................................................................294 Глава 9. Декораторы и замыкания ...............................................300 Что нового в этой главе ..................................................................................301 Краткое введение в декораторы ....................................................................301 Когда Python выполняет декораторы ............................................................302 Регистрационные декораторы .......................................................................304 Правила видимости переменных ..................................................................304 Замыкания ......................................................................................................307 Объявление nonlocal ......................................................................................310 Логика поиска переменных .......................................................................311 Реализация простого декоратора ..................................................................312 Как это работает .........................................................................................313 Декораторы в стандартной библиотеке ........................................................314 Запоминание с помощью functools.cache .................................................315 Использование lru_cache ............................................................................317 Обобщенные функции с одиночной диспетчеризацией .........................318 Параметризованные декораторы ..................................................................322 Параметризованный регистрационный декоратор .................................323 Параметризованный декоратор clock .......................................................324 Декоратор clock на основе класса ..............................................................327 Резюме .............................................................................................................328 Дополнительная литература ..........................................................................328 Глава 10. Реализация паттернов проектирования с помощью полноправных функций ...........................................333 Что нового в этой главе ..................................................................................334 Практический пример: переработка паттерна Стратегия ..........................334 Классическая Стратегия .............................................................................334 Функционально-ориентированная стратегия ..............................................338 Выбор наилучшей стратегии: простой подход .........................................341 Поиск стратегий в модуле ..........................................................................342 Паттерн Стратегия, дополненный декоратором ..........................................343 Паттерн Команда ............................................................................................345 Резюме .............................................................................................................346 Дополнительная литература ..........................................................................347 ЧАСТЬ III. КЛАССЫ И ПРОТОКОЛЫ ...............................351 Глава 11. Объект в духе Python ....................................................352 Что нового в этой главе ..................................................................................353 Представления объекта ..................................................................................353 И снова класс вектора ....................................................................................354 Альтернативный конструктор .......................................................................356 Декораторы classmethod и staticmethod .......................................................357 Оглавление 11
Форматирование при выводе ........................................................................358 Хешируемый класс Vector2d ..........................................................................361 Поддержка позиционного сопоставления с образцом ................................363 Полный код класса Vector2d, версия 3 ...........................................................365 Закрытые и «защищенные» атрибуты в Python ...........................................368 Экономия памяти с помощью атрибута класса __slots__ .............................370 Простое измерение экономии, достигаемой за счет __slot__ ..................372 Проблемы при использовании __slots__ ....................................................373 Переопределение атрибутов класса ..............................................................374 Резюме .............................................................................................................376 Дополнительная литература ..........................................................................377 Глава 12. Специальные методы для последовательностей ....381 Что нового в этой главе ..................................................................................381 Vector: пользовательский тип последовательности .....................................382 Vector, попытка № 1: совместимость с Vector2d ...........................................382 Протоколы и утиная типизация ....................................................................385 Vector, попытка № 2: последовательность, допускающая срез ...................386 Как работает срезка ....................................................................................387 Метод __getitem__ с учетом срезов ............................................................388 Vector, попытка № 3: доступ к динамическим атрибутам ..........................390 Vector, попытка № 4: хеширование и ускорение оператора == ..................393 Vector, попытка № 5: форматирование ........................................................399 Резюме .............................................................................................................406 Дополнительная литература ..........................................................................407 Глава 13. Интерфейсы, протоколы и ABC ....................................411 Карта типизации .............................................................................................412 Что нового в этой главе ..................................................................................413 Два вида протоколов ......................................................................................413 Программирование уток ................................................................................415 Python в поисках следов последовательностей ........................................415 Партизанское латание как средство реализации протокола во время выполнения .....................................................................................417 Защитное программирование и принцип быстрого отказа ...................419 Гусиная типизация .........................................................................................421 Создание подкласса ABC ................................................................................426 ABC в стандартной библиотеке .....................................................................427 Определение и использование ABC ..............................................................430 Синтаксические детали ABC ......................................................................435 Создание подклассов ABC ..........................................................................435 Виртуальный подкласс Tombola ................................................................438 Использование функции register на практике .............................................440 ABC и структурная типизация ...................................................................440 Статические протоколы .................................................................................442 Типизированная функция double ..............................................................443 Статические протоколы, допускающие проверку во время выполнения .....444 12 Оглавление
Ограничения протоколов, допускающих проверку во время выполнения .................................................................................447 Поддержка статического протокола .........................................................448 Проектирование статического протокола ................................................450 Рекомендации по проектированию протоколов......................................451 Расширение протокола ..............................................................................452 ABC из пакета numbers и числовые протоколы........................................453 Резюме .............................................................................................................456 Дополнительная литература ..........................................................................457 Глава 14. Наследование: к добру или к худу..............................462 Что нового в этой главе ..................................................................................463 Функция super() ..............................................................................................463 Сложности наследования встроенным типам ..............................................465 Множественное наследование и порядок разрешения методов ................468 Классы-примеси .............................................................................................473 Отображения, не зависящие от регистра ..................................................473 Множественное наследование в реальном мире .........................................475 ABC – тоже примеси ...................................................................................475 ThreadingMixIn и ForkingMixIn ..................................................................475 Множественное наследование в Tkinter ...................................................480 Жизнь с множественным наследованием ....................................................482 Предпочитайте композицию наследованию класса ................................483 Разберитесь, зачем наследование используется в каждом конкретном случае.....................................................................483 Определяйте интерфейсы явно с помощью ABC .....................................483 Используйте примеси для повторного использования кода ..................484 Предоставляйте пользователям агрегатные классы ...............................484 Наследуйте только классам, предназначенным для наследования ........484 Воздерживайтесь от наследования конкретным классам .......................485 Tkinter: хороший, плохой, злой .................................................................485 Резюме .............................................................................................................487 Дополнительная литература ..........................................................................488 Глава 15. Еще об аннотациях типов .............................................492 Что нового в этой главе ..................................................................................492 Перегруженные сигнатуры ............................................................................492 Перегрузка max ...........................................................................................494 Уроки перегрузки max ................................................................................498 TypedDict .........................................................................................................498 Приведение типов ..........................................................................................505 Чтение аннотаций типов во время выполнения ..........................................508 Проблемы с аннотациями во время выполнения ....................................508 Как решать проблему .................................................................................511 Реализация обобщенного класса ...................................................................511 Основы терминологии, относящейся к обобщенным типам ..................513 Вариантность ..................................................................................................514 Оглавление 13
Инвариантный разливочный автомат ......................................................514 Ковариантный разливочный автомат .......................................................516 Контравариантная урна .............................................................................516 Обзор вариантности ...................................................................................518 Реализация обобщенного статического протокола .....................................520 Резюме .............................................................................................................522 Дополнительная литература ..........................................................................523 Глава 16. Перегрузка операторов ................................................528 Что нового в этой главе ..................................................................................529 Основы перегрузки операторов ....................................................................529 Унарные операторы .......................................................................................530 Перегрузка оператора сложения векторов + ................................................533 Перегрузка оператора умножения на скаляр * .............................................538 Использование @ как инфиксного оператора .............................................540 Арифметические операторы – итоги ............................................................541 Операторы сравнения ....................................................................................542 Операторы составного присваивания ..........................................................545 Резюме .............................................................................................................549 Дополнительная литература ..........................................................................550 ЧАСТЬ IV. ПОТОК УПРАВЛЕНИЯ .....................................555 Глава 17. Итераторы, генераторы и классические сопрограммы .......................................................556 Что нового в этой главе ..................................................................................557 Последовательность слов ...............................................................................557 Почему последовательности итерируемы: функция iter .............................558 Использование iter в сочетании с Callable ................................................560 Итерируемые объекты и итераторы .............................................................561 Классы Sentence с методом __iter__................................................................564 Класс Sentence, попытка № 2: классический итератор ...........................565 Не делайте итерируемый объект итератором для самого себя ...............566 Класс Sentence, попытка № 3: генераторная функция ............................567 Как работает генератор ..............................................................................568 Ленивые классы Sentence ...............................................................................570 Класс Sentence, попытка № 4: ленивый генератор ..................................570 Класс Sentence, попытка № 5: генераторное выражение ........................571 Генераторные выражения: когда использовать ...........................................573 Генератор арифметической прогрессии .......................................................575 Построение арифметической прогрессии с помощью itertools ..............577 Генераторные функции в стандартной библиотеке .....................................578 Функции редуцирования итерируемого объекта .........................................588 yield from и субгенераторы ............................................................................590 Изобретаем chain заново ...........................................................................591 Обход дерева ...............................................................................................592 Обобщенные итерируемые типы ..................................................................596 14 Оглавление
Классические сопрограммы ...........................................................................597 Пример: сопрограмма для вычисления накопительного среднего .......599 Возврат значения из сопрограммы ...........................................................601 Аннотации обобщенных типов для классических сопрограмм ..............605 Резюме .............................................................................................................607 Дополнительная литература ..........................................................................607 Глава 18. Блоки with, match и else ...............................................612 Что нового в этой главе ..................................................................................613 Контекстные менеджеры и блоки with .........................................................613 Утилиты contextlib ......................................................................................617 Использование @contextmanager .............................................................618 Сопоставление с образцом в lis.py: развернутый пример ...........................622 Синтаксис Scheme ......................................................................................622 Предложения импорта и типы ..................................................................623 Синтаксический анализатор .....................................................................624 Класс Environment ......................................................................................626 Цикл REPL ...................................................................................................628 Вычислитель ...............................................................................................629 Procedure: класс, реализующий замыкание .............................................636 Использование OR-образцов .....................................................................637 Делай то, потом это: блоки else вне if ...........................................................638 Резюме .............................................................................................................640 Дополнительная литература ..........................................................................641 Глава 19. Модели конкурентности в Python ...............................646 Что нового в этой главе ..................................................................................647 Общая картина ................................................................................................647 Немного терминологии ..................................................................................648 Процессы, потоки и знаменитая блокировка GIL в Python ....................650 Конкурентная программа Hello World ..........................................................652 Анимированный индикатор с потоками ..................................................652 Индикатор с процессами ...........................................................................655 Индикатор с сопрограммами ....................................................................656 Сравнение супервизоров ...........................................................................660 Истинное влияние GIL ...............................................................................662 Проверка знаний ........................................................................................662 Доморощенный пул процессов .....................................................................665 Решение на основе процессов ...................................................................666 Интерпретация времени работы ...............................................................667 Код проверки на простоту для многоядерной машины ..........................668 Эксперименты с большим и меньшим числом процессов ......................671 Не решение на основе потоков ..................................................................672 Python в многоядерном мире ........................................................................673 Системное администрирование ................................................................674 Наука о данных ...........................................................................................675 Веб-разработка на стороне сервера и на мобильных устройствах .........676 Оглавление 15
WSGI-серверы приложений .......................................................................678 Распределенные очереди задач .................................................................680 Резюме .............................................................................................................681 Дополнительная литература ..........................................................................682 Конкурентность с применением потоков и процессов ...........................682 GIL ................................................................................................................684 Конкурентность за пределами стандартной библиотеки ........................684 Конкурентность и масштабируемость за пределами Python ..................686 Глава 20. Конкурентные исполнители .........................................691 Что нового в этой главе ..................................................................................691 Конкурентная загрузка из веба .....................................................................692 Скрипт последовательной загрузки ..........................................................694 Загрузка с применением библиотеки concurrent.futures ........................696 Где находятся будущие объекты? ..............................................................698 Запуск процессов с помощью concurrent.futures .........................................701 И снова о проверке на простоту на многоядерной машине ...................701 Эксперименты с Executor.map ...................................................................704 Загрузка с индикацией хода выполнения и обработкой ошибок ...............707 Обработка ошибок во flags2-примерах .....................................................711 Использование futures.as_completed .........................................................713 Резюме .............................................................................................................716 Дополнительная литература ..........................................................................716 Глава 21. Асинхронное программирование ...............................719 Что нового в этой главе ..................................................................................720 Несколько определений .................................................................................720 Пример использования asyncio: проверка доменных имен ...................721 Предложенный Гвидо способ чтения асинхронного кода .......................723 Новая концепция: объекты, допускающие ожидание .................................724 Загрузка файлов с помощью asyncio и HTTPX .............................................725 Секрет платформенных сопрограмм: скромные генераторы .................727 Проблема «все или ничего» .......................................................................728 Асинхронные контекстные менеджеры ........................................................729 Улучшение асинхронного загрузчика ...........................................................730 Использование asyncio.as_completed и потока .........................................731 Регулирование темпа запросов с помощью семафора ............................733 Отправка нескольких запросов при каждой загрузке .............................736 Делегирование задач исполнителям .............................................................739 Написание асинхронных серверов ................................................................740 Веб-служба FastAPI .....................................................................................742 Асинхронный TCP-сервер ..........................................................................746 Асинхронные итераторы и итерируемые объекты ......................................751 Асинхронные генераторные функции ......................................................752 Асинхронные включения и асинхронные генераторные выражения ..... 758 async за пределами asyncio: Curio .............................................................760 Аннотации типов для асинхронных объектов .............................................763 16 Оглавление
Как работает и как не работает асинхронность ...........................................764 Круги, разбегающиеся вокруг блокирующих вызовов ............................764 Миф о системах, ограниченных вводом-выводом ..................................765 Как не попасть в ловушку счетных функций ............................................765 Резюме .............................................................................................................766 Дополнительная литература ..........................................................................767 ЧАСТЬ V. МЕТАПРОГРАММИРОВАНИЕ .........................771 Глава 22. Динамические атрибуты и свойства ..........................772 Что нового в этой главе ..................................................................................772 Применение динамических атрибутов для обработки данных ..................773 Исследование JSON-подобных данных с динамическими атрибутами .... 775 Проблема недопустимого имени атрибута ..............................................778 Гибкое создание объектов с помощью метода __new__ ............................779 Вычисляемые свойства ..................................................................................781 Шаг 1: создание управляемого данными атрибута ..................................782 Шаг 2: выборка связанных записей с помощью свойств .........................784 Шаг 3: переопределение существующего атрибута свойством ...............787 Шаг 4: кеширование свойств на заказ .......................................................788 Шаг 5: кеширование свойств с помощью functools ..................................789 Использование свойств для контроля атрибутов .........................................791 LineItem, попытка № 1: класс строки заказа ............................................791 LineItem, попытка № 2: контролирующее свойство ................................792 Правильный взгляд на свойства ....................................................................794 Свойства переопределяют атрибуты экземпляра ....................................795 Документирование свойств .......................................................................797 Программирование фабрики свойств ...........................................................798 Удаление атрибутов ........................................................................................800 Важные атрибуты и функции для работы с атрибутами .............................802 Специальные атрибуты, влияющие на обработку атрибутов .................802 Встроенные функции для работы с атрибутами ......................................803 Специальные методы для работы с атрибутами ......................................804 Резюме .............................................................................................................805 Дополнительная литература ..........................................................................806 Глава 23. Дескрипторы атрибутов ...............................................810 Что нового в этой главе ..................................................................................810 Пример дескриптора: проверка значений атрибутов .................................811 LineItem попытка № 3: простой дескриптор ............................................811 LineItem попытка № 4: автоматическое генерирование имен атрибутов хранения ..........................................................................816 LineItem попытка № 5: новый тип дескриптора ......................................818 Переопределяющие и непереопределяющие дескрипторы........................820 Переопределяющие дескрипторы .............................................................822 Переопределяющий дескриптор без __get__ .............................................823 Непереопределяющий дескриптор ...........................................................824 Перезаписывание дескриптора в классе ..................................................825 Оглавление 17
Методы являются дескрипторами ................................................................826 Советы по использованию дескрипторов .....................................................828 Строка документации дескриптора и перехват удаления ...........................829 Резюме .............................................................................................................831 Дополнительная литература ..........................................................................831 Глава 24. Метапрограммирование классов ................................834 Что нового в этой главе ..................................................................................835 Классы как объекты ........................................................................................835 type: встроенная фабрика классов ................................................................836 Функция-фабрика классов .............................................................................837 Введение в __init_subclass__ ........................................................................840 Почему __init_subclass__ не может конфигурировать __slots__ ................846 Дополнение класса с помощью декоратора класса ......................................847 Что когда происходит: этап импорта и этап выполнения ...........................849 Демонстрация работы интерпретатора ....................................................850 Основы метаклассов .......................................................................................854 Как метакласс настраивает класс ..............................................................856 Элегантный пример метакласса ................................................................857 Демонстрация работы метакласса ............................................................860 Реализация Checked с помощью метакласса ................................................864 Метаклассы на практике ................................................................................868 Современные средства позволяют упростить или заменить метаклассы ..........................................................................868 Метаклассы – стабильное языковое средство ..........................................869 У класса может быть только один метакласс ............................................869 Метаклассы должны быть деталью реализации.......................................870 Метаклассный трюк с __prepare__ ..................................................................870 Заключение .....................................................................................................872 Резюме .............................................................................................................873 Дополнительная литература ..........................................................................874 Послесловие ....................................................................................878 Предметный указатель ..................................................................881 18 Оглавление
Предисловие от издательства Отзывы и пОжелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете об этой книге – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв на нашем сайте www.dmkpress.com, зайдя на страницу книги и оставив комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору по адресу dmkpress@gmail.com; при этом укажите название книги в теме письма. Если вы являетесь экспертом в какой-либо области и заинтересованы в написании новой книги, заполните форму на нашем сайте по адресу http://dmkpress.com/ authors/publish_book/ или напишите в издательство по адресу dmkpress@gmail.com. СпиСОк ОпечатОк Хотя мы приняли все возможные меры для того, чтобы обеспечить высокое качество наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг – возможно, ошибку в основном тексте или программном коде, – мы будем очень благодарны, если вы сообщите нам о ней. Сделав это, вы избавите других читателей от недопонимания и поможете нам улучшить последующие издания этой книги. Если вы найдете какие-либо ошибки в коде, пожалуйста, сообщите о них главному редактору по адресу dmkpress@gmail.com, и мы исправим это в следующих тиражах. нарушение автОрСких прав Пиратство в интернете по-прежнему остается насущной проблемой. Издательство « ДМК Пресс» очень серьезно относится к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь в интернете с незаконной публикацией какой-либо из наших книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы мы могли применить санкции. Ссылку на подозрительные материалы можно прислать по адресу dmkpress@gmail.com. Мы высоко ценим любую помощь по защите наших авторов, благодаря которой мы можем предоставлять вам качественные материалы.
Об авторе Лусиану Рамальо был веб-разработчиком до выхода компании Netscape на IPO в 1995 году, а в 1998 году перешел с Perl на Java, а затем на Python. В 2015 году пришел в компанию Thoughtworks, где работает главным консультантом в отделении в Сан-Паулу. Он выступал с основными докладами, презентациями и пособиями на различных мероприятиях, связанных с Python, в обеих Амери- ках, Европе и Азии. Выступал также на конференциях по Go и Elixir по вопросам проектирования языков. Рамальо – член фонда Python Software Foundation и сооснователь клуба Garoa Hacker Clube, первого места для общения хакеров в Бразилии. Колофон На обложке изображена намакская песчаная ящерица (Pedioplanis namaquensis), встречающаяся в засушливых саваннах и полупустынях Намибии. Внешние признаки: туловище черное с четырьмя белыми полосками на спине, лапы коричневые с белыми пятнышками, брюшко белое, длинный розовато- коричневый хвост. Одна из самых быстрых ящериц, активна в течение дня, питается мелкими насекомыми. Обитает на бедных растительностью песчано- каменистых равнинах. Самка откладывает от трех до пяти яиц в ноябре. Остаток зимы ящерицы спят в норах, которые роют в корнях кустов. В настоящее время охранный статус намакской песчаной ящерицы – «пониженная уязвимость». Многие животные, изображенные на обложках книг O’Reilly, находятся под угрозой вымирания; все они важны для мира.
Предисловие План такой: если кто-то пользуется средством, которое вы не понимаете, просто пристрелите его. Это проще, чем учить что-то новое, и очень скоро в мире останутся только кодировщики, которые используют только всем понятное крохотное подмножество Python 0.9.6 <смешок>. – Тим Питерс, легендарный разработчик ядра и автор сборника поучений «The Zen of Python»1 «Python – простой для изучения и мощный язык программирования». Это первые слова в официальном «Пособии по Python» (https://docs.python.org/3/tutorial/). И это правда, но не вся правда: поскольку язык так просто выучить и начать применять на деле, многие практикующие программисты используют лишь малую часть его обширных возможностей. Опытный программист может написать полезный код на Python уже через несколько часов изучения. Но вот проходят недели, месяцы – и многие разработчики так и продолжают писать на Python код, в котором отчетливо видно влияние языков, которые они учили раньше. И даже если Python – ваш первый язык, все равно авторы академических и вводных учебников зачастую излагают его, тщательно избегая особенностей, характерных только для этого языка. Будучи преподавателем, который знакомит с Python программистов, знающих другие языки, я нередко сталкиваюсь еще с одной проблемой, которую пытаюсь решить в этой книге: нас интересует только то, о чем мы уже знаем. Любой программист, знакомый с каким-то другим языком, догадывается, что Python поддерживает регулярные выражения, и начинает смотреть, что про них написано в документации. Но если вы никогда раньше не слыхали о распаковке кортежей или о дескрипторах, то, скорее всего, и искать сведения о них не станете, а в результате не будете использовать эти средства лишь потому, что они специфичны для Python. Эта книга не является полным справочным руководством по Python. Упор в ней сделан на языковые средства, которые либо уникальны для Python, либо отсутствуют во многих других популярных языках. Кроме того, в книге рассматривается в основном ядро языка и немногие библиотеки. Я редко упоминаю о пакетах, не включенных в стандартную библиотеку, хотя нынче количество пакетов для Python уже перевалило за 60 000 и многие из них исключительно полезны. на кОгО раССчитана эта книга Эта книга написана для практикующих программистов на Python, которые хотят усовершенствоваться в Python 3. Я тестировал примеры на Python 3.10, 1 Сообщение в группе Usenet comp.lang.python от 23 декабря 2002: «Acrimony in c.l.p.» (https://mail.python.org/pipermail/python-list/2002-December/147293.html).
а большую их часть также на Python 3.9 и 3.8. Если какой-то пример требует версии 3.10, то это явно оговаривается. Если вы не уверены в том, достаточно ли хорошо знаете Python, чтобы читать эту книгу, загляните в оглавление официального «Пособия по Python» (https://docs.python.org/3/tutorial/). Темы, рассмотренные в пособии, в этой книге не затрагиваются, за исключением некоторых новых средств. на кОгО эта книга не раССчитана Если вы только начинаете изучать Python, эта книга покажется вам сложно- ватой. Более того, если вы откроете ее на слишком раннем этапе путешествия в мир Python, то может сложиться впечатление, будто в каждом Python-скрипте следует использовать специальные методы и приемы метапрограммирова- ния. Преждевременное абстрагирование ничем не лучше преждевременной оптимизации. пять книг в ОднОй Я рекомендую всем прочитать главу 1 «Модель данных в языке Python». Читатели этой книги в большинстве своем после ознакомления с главой 1, скорее всего, смогут легко перейти к любой части, но я зачастую предполагаю, что главы каждой части читаются по порядку. Части I–V можно рассматривать как отдельные книги внутри книги. Я старался сначала рассказывать о том, что уже есть, а лишь затем о том, как создавать что-то свое. Например, в главе 2 части II рассматриваются готовые типы последовательностей, в том числе не слишком хорошо известные, например collections.deque. О создании пользовательских последовательностей речь пойдет только в части III, где мы также узнаем об использовании абстрактных базовых классов (abstract base classes – ABC) из модуля collections.abc. Создание собственного ABC обсуждается еще позже, поскольку я считаю, что сначала нужно освоиться с использованием ABC, а уж потом писать свои. У такого подхода несколько достоинств. Прежде всего, зная, что есть в вашем распоряжении, вы не станете заново изобретать велосипед. Мы пользуемся готовыми классами коллекций чаще, чем реализуем собственные, и можем уделить больше внимания нетривиальным способам работы с имеющимися средствами, отложив на потом разговор о разработке новых. И мы скорее унаследуем существующему абстрактному базовому классу, чем будем создавать новый с нуля. Наконец, я полагаю, что понять абстракцию проще после того, как видел ее в действии. Недостаток же такой стратегии в том, что главы изобилуют ссылками на более поздние материалы. Надеюсь, что теперь, когда вы узнали, почему я избрал такой путь, вам будет проще смириться с этим. как ОрганизОвана эта книга Ниже описаны основные темы, рассматриваемые в каждой части книги. 22 Предисловие
Часть I «Структуры данных» В главе I, посвященной модели данных в Python, объясняется ключевая роль специальных методов (например, __repr__) для обеспечения единообразного поведения объектов любого типа. Специальные методы более подробно обсуждаются на протяжении всей книги. В остальных главах этой части рассматривается использование типов коллекций: последовательностей, отображений и множеств, а также различие между типами str и bytes – то, что радостно приветствовали пользователи Python 3 и чего отчаянно не хватает пользователям Python 2, еще не модернизировавшим свой код. Также рассматриваются высокоуровневые построители классов, имеющие ся в стандартной библиотеке: фабрики именованных кортежей и декоратор @dataclass. Сопоставление с образцом – новая возможность, появившаяся в Python 3.10, – рассматривается в разделах глав 2, 3 и 5, где обсуждаются паттерны последовательностей, отображений и классов. Последняя глава части I посвящена жизненному циклу объектов: ссылкам, изменяемости и сборке мусора. Часть II «Функции как объекты» Здесь речь пойдет о функциях как полноправных объектах языка: что под этим понимается, как это отражается на некоторых популярных паттернах проектирования и как реализовать декораторы функций с помощью замыканий. Рассматриваются также следующие вопросы: общая идея вызываемых объектов, атрибуты функций, интроспекция, аннотации параметров и появившееся в Python 3 объявление nonlocal. Глава 8 содержит введение в новую важную тему – аннотации типов в сигнатурах функций. Часть III «Классы и протоколы» Теперь наше внимание перемещается на создание классов «вручную» – в отличие от использования построителей классов, рассмотренных в главе 5. Как и в любом объектно-ориентированном (ОО) языке, в Python имеется свой набор средств; какие-то из них, возможно, присутствовали в языке, с которого вы и я начинали изучение программирования на основе классов, а какие-то – нет. В главах из этой части объясняется, как создать свою коллекцию, абстрактный базовый класс (ABC) и протокол, как работать со множественным наследованием и как реализовать перегрузку операторов (если это имеет смысл). В главе 15 мы продолжим обсуждать аннотации типов. Часть IV «Поток управления» Эта часть посвящена языковым конструкциям и библиотекам, выходящим за рамки последовательного потока управления с его условными выражениями, циклами и подпрограммами. Сначала мы рассматриваем генераторы, затем – контекстные менеджеры и сопрограммы, в том числе трудную для понимания, но исключительно полезную новую конструкцию yield from. В главу 18 включен важный пример использования сопоставления с образцом в простом, но функциональном интерпретаторе языка. Глава 19 «Модели конкурентности в Python» новая, она посвящена обзору различных Предисловие 23