- •Об авторе
- •О группе редакторов
- •Предисловие
- •Введение
- •Как использовать эту книгу
- •Загрузка исходного кода CPython
- •Что в исходном коде?
- •Настройка среды разработки
- •IDE или редактор?
- •Настройка Visual Studio
- •Настройка Visual Studio Code
- •Настройка Vim
- •Выводы
- •Компиляция CPython
- •Компиляция CPython на macOS
- •Компиляция CPython на Linux
- •Установка специализированной версии
- •Знакомство с Make
- •Make-цели CPython
- •Компиляция CPython на Windows
- •Профильная оптимизация
- •Выводы
- •Грамматика и язык Python
- •Спецификация языка Python
- •Генератор парсеров
- •Повторное генерирование грамматики
- •Выводы
- •Конфигурация и ввод
- •Конфигурация состояния
- •Структура данных конфигурации среды выполнения
- •Конфигурация сборки
- •Сборка модуля из входных данных
- •Выводы
- •Генерирование конкретного синтаксического дерева
- •Парсер/токенизатор CPython
- •Абстрактные синтаксические деревья
- •Важные термины
- •Пример: добавление оператора «почти равно»
- •Выводы
- •Компилятор
- •Исходные файлы
- •Важные термины
- •Создание экземпляра компилятора
- •Флаги будущей функциональности и флаги компилятора
- •Таблицы символических имен
- •Основная компиляция
- •Ассемблер
- •Создание объекта кода
- •Использование Instaviz для вывода объекта кода
- •Пример: реализация оператора «почти равно»
- •Выводы
- •Цикл вычисления
- •Исходные файлы
- •Важные термины
- •Построение состояния потока
- •Построение объектов кадров
- •Выполнение кадра
- •Стек значений
- •Пример: добавление элемента в список
- •Выводы
- •Управление памятью
- •Выделение памяти в C
- •Проектирование системы управления памятью Python
- •Аллокаторы памяти CPython
- •Область выделения объектной памяти и PyMem
- •Область выделения сырой памяти
- •Нестандартные области выделения памяти
- •Санитайзеры выделенной памяти
- •Арена памяти PyArena
- •Подсчет ссылок
- •Сборка мусора
- •Выводы
- •Параллелизм и конкурентность
- •Модели параллелизма и конкурентности
- •Структура процесса
- •Многопроцессорный параллелизм
- •Многопоточность
- •Асинхронное программирование
- •Генераторы
- •Сопрограммы
- •Асинхронные генераторы
- •Субинтерпретаторы
- •Выводы
- •Объекты и типы
- •Примеры этой главы
- •Встроенные типы
- •Типы объектов
- •Тип type
- •Типы bool и long
- •Тип строки Юникода
- •Словари
- •Выводы
- •Стандартная библиотека
- •Модули Python
- •Модули Python и C
- •Набор тестов
- •Запуск набора тестов в Windows
- •Запуск набора тестов в Linux или macOS
- •Флаги тестирования
- •Запуск конкретных тестов
- •Модули тестирования
- •Вспомогательные средства тестирования
- •Выводы
- •Отладка
- •Обработчик сбоев
- •Компиляция поддержки отладки
- •LLDB для macOS
- •Отладчик Visual Studio
- •Отладчик CLion
- •Выводы
- •Бенчмаркинг, профилирование и трассировка
- •Использование timeit для микробенчмарка
- •Использование набора тестов производительности Python
- •Профилирование кода Python с использованием cProfile
- •Выводы
- •Что дальше?
- •Создание расширений C для CPython
- •Улучшение приложений Python
- •Участие в проекте CPython
- •Дальнейшее обучение
- •Препроцессор C
- •Базовый синтаксис C
- •Выводы
- •Благодарности
Объекты и типы
В поставку CPython включен набор базовых типов: строки, списки, кортежи, словари, объекты и т. д. Все эти типы являются встроенными. Вам не придется импортировать никакие пакеты, даже из стандартной библиотеки. Например, для создания нового списка можно вызвать функцию list():
lst = list()
А можно воспользоваться квадратными скобками:
lst = []
Строки могут создаваться на основе строковых литералов при помощи одинарных или двойных кавычек. В главе «Грамматика и язык Python» были представлены грамматические определения, которые заставляют компилятор интерпретировать двойные кавычки как строковый литерал.
Все типы в Python наследуются от встроенного базового типа object, даже строки, кортежи и списки.
В файле Objects object.c находится базовая реализация типа object, написанная на чистом C. В ней содержатся некоторые конкретные реализации базовой логики (например, поверхностное сравнение1).
Можно считать, что объект Python состоит из двух частей:
1.Базовая модель данных с указателями на скомпилированные функции.
2.Словарь с нестандартными атрибутами и методами.
1 Поверхностное сравнение — сравнение объектов без проверки того, являются ли они одним и тем же объектом и указывают ли на один и тот же адрес памяти. Проще говоря, сравнение значений объектов. — Примеч. ред.
Книги для программистов: https://t.me/booksforits
Примеры этой главы 261
Большая часть базового API объекта объявляется в Objects object.c, как и реализация встроенной функции repr(), PyObject_Repr. Также здесь можно найти PyObject_Hash() и другие API.
Все эти функции могут переопределяться в пользовательских объектах с помощью реализации соответствующих dunder-методов для объектов Python:
class MyObject(object):
def __init__(self, id, name): self.id = id
self.name = name
def __repr__(self):
return "<{0} id={1}>".format(self.name, self.id)
Эти встроенные функции в совокупности называются моделью данных Python1. Не все методы в объекте Python являются частью модели данных, что позволяет объектам Python содержать как атрибуты классов и экземпляров, так и методы.
СМ. ТАКЖЕ
Один из лучших источников информации омодели данных Python— книга Лучано Рамальо (Luciano Ramalho) «Fluent Python».
ПРИМЕРЫ ЭТОЙ ГЛАВЫ
Вэтой главе объяснение каждого типа будет сопровождаться примером.
Впримере мы реализуем оператор «почти равно», созданный в предшествующих главах.
Если вы еще не внесли изменения, которые были описаны в главах, посвященных грамматике CPython и компилятору, обязательно вернитесь и сделайте это, прежде чем читать дальше. Это необходимо для реализации рассматриваемых примеров.
1 https://docs.python.org/3/reference/datamodel.html.
Книги для программистов: https://t.me/booksforits
262 Объекты и типы
ВСТРОЕННЫЕ ТИПЫ
Базовая модель данных определяется в PyTypeObject, а функции определяются в Objects typeobject.c.
Каждый из исходных файлов имеет соответствующий заголовок в Include. Например, Objects/rangeobject.c имеет заголовочный файл Include rangeobject.h.
Ниже приведен список исходных файлов и соответствующих им типов.
ИСХОДНЫЙ ФАЙЛ |
ТИП |
Objects object.c |
Встроенные методы и базовый объект |
Objects boolobject.c |
Тип bool |
Objects bytearrayobject.c |
Тип byte[] |
Objects bytesobject.c |
Тип bytes |
Objects cellobject.c |
Тип cell |
Objects classobject.c |
Абстрактный тип class, используемый в метапрограм- |
|
мировании |
Objects codeobject.c |
Встроенный тип объекта code |
Objects complexobject.c |
Тип комплексного числа |
Objects iterobject.c |
Тип итератора |
Objects listobject.c |
Тип list |
Objects longobject.c |
Числовой тип long |
Objects memoryobject.c |
Базовый тип памяти (объект memoryview) |
Objects methodobject.c |
Тип метода класса |
Objects moduleobject.c |
Тип модуля |
Objects |
Тип пространства имен |
namespaceobject.c |
|
Objects odictobject.c |
Тип упорядоченного словаря |
Objects rangeobject.c |
Тип генератора диапазона (range) |
Objects setobject.c |
Тип set |
Objects sliceobject.c |
Тип ссылки на срез |
Книги для программистов: https://t.me/booksforits
Типы объектов 263
ИСХОДНЫЙ ФАЙЛ |
ТИП |
Objects structseq.c |
Тип struct.Struct |
Objects tupleobject.c |
Тип tuple |
Objects typeobject.c |
Тип type |
Objects unicodeobject.c |
Тип str |
Objects weakrefobject.c |
Тип weakref |
Некоторые типы будут рассмотрены в этой главе.
ТИПЫ ОБЪЕКТОВ
Так как C в отличие от Python не является объектно-ориентированным языком1, объекты C не наследуются друг от друга. PyObject определяет исходный сегмент данных для любого объекта Python, а PyObject * представляет ссылку на него.
При определении типов Python typedef использует один из двух макросов:
1.PyObject_HEAD (PyObject) для простых типов.
2.PyObject_VAR_HEAD (PyVarObject) для контейнерных типов.
Для простого типа PyObject содержит следующие поля:
ПОЛЕ |
ТИП |
НАЗНАЧЕНИЕ |
ob_refcnt |
Py_ssize_t |
Счетчик ссылок на экземпляр |
ob_type |
_typeobject* |
Тип объекта |
Например, cellobject объявляет одно поле ob_ref в дополнение к базовым:
typedef struct {
PyObject_HEAD
PyObject *ob_ref; /* Содержимое ячейки или NULL для пустой ячейки */
} PyCellObject;
1 https://realpython.com/python3-object-oriented-programming/.
Книги для программистов: https://t.me/booksforits