- •Об авторе
- •О группе редакторов
- •Предисловие
- •Введение
- •Как использовать эту книгу
- •Загрузка исходного кода 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
- •Выводы
- •Благодарности
Конфигурация и ввод
После рассмотрения грамматики Python давайте разберемся, как код переходит в исполняемое состояние.
Существует много способов выполнения Python-кода в CPython. Несколько наиболее популярных:
1.Выполнение команды python -c со строкой Python.
2.Выполнение команды python -m с именем модуля.
3.Выполнение команды python <файл> с путем к файлу, содержащему Python-код.
4.Передача Python-кода исполняемому файлу python через stdin — например, cat <файл> | python.
5.Запуск REPL и выполнение команд по очереди.
6.Использование C API и Python как встроенной среды.
СМ. ТАКЖЕ
Обилие способов выполнения скриптов Python ошеломляет. За допол нительной информацией о выполнении скриптов Python обратитесь к статье «How to Run Your Python Scripts»1 на сайте Real Python.
1 https://realpython.com/run-python-scripts/.
Книги для программистов: https://t.me/booksforits
74 Конфигурация и ввод
Для выполнения любого Python-кода интерпретатору понадобятся три элемента:
1.Модуль, который должен быть выполнен.
2.Состояние для хранения информации (например, переменных).
3.Конфигурация (активные настройки).
Сэтими тремя компонентами интерпретатор может выполнить код и предоставить вывод:
|
|
|
|
|
|
|
|
|
|
ПРИМЕЧАНИЕ
По аналогии с руководством по стилю PEP 8 для Python-кода существу ет руководство PEP 7 для кода C в CPython. Оно включает следующие стандарты выбора имен для исходного кода C:
•Префикс Py для общедоступных функций (и никогда для статиче ских).
•Префикс Py_ для глобальных служебных процедур — таких, как Py_FatalError. Конкретные группы функций (например, API кон кретных объектных типов) должны использовать более длинный префикс — например, PyString_ для строковых функций.
•Имена общедоступных функций и переменных должны запи сываться в смешанном регистре с разделением слов нижним подчеркиванием — например, PyObject_GetAttr(), Py_BuildValue() и PyExc_TypeError().
Книги для программистов: https://t.me/booksforits
Конфигурация состояния 75
•Префикс _Py должен быть зарезервирован для внутренних функ ций, которые должны быть видимыми для загрузчика, например
_PyObject_Dump().
•Имена макросов должны иметь префикс в смешанном регистре, все остальные слова должны быть в верхнем регистре и разде лены нижним подчеркиванием, например PyString_AS_STRING
и Py_PRINT_RAW.
Существует не так много программных инструментов для проверки соблюдения руководства PEP 7 (в отличие от PEP 8). Эта задача должна решаться разработчиками входе код-ревью.Как илюбой процесс,управ ляемыйчеловеком,такойкод-ревьюнеизбавленотошибок,поэтомувам, скорее всего, попадется код, не соответствующий PEP 7. Единственный инструмент автоматизации этого процесса, входящий в дистрибутив, — скрипт smelly.py,который можно выполнить командой make smelly вLinux или macOS либо запустить из командной строки:
$ ./python Tools/scripts/smelly.py
Скрипт выдает сообщения об ошибках для всех символических имен в libpython (общей библиотеке CPython), не начинающихся с Py или _Py.
КОНФИГУРАЦИЯ СОСТОЯНИЯ
Прежде чем выполнять какой-либо Python-код, среда выполнения CPython сначала устанавливает конфигурацию среды выполнения Python с учетом всех параметров, переданных пользователем.
Согласно определению из PEP 587, данные конфигурации среды выполнения хранятся в трех местах:
1. PyPreConfig — данные конфигурации для предварительной инициализации.
2.PyConfig — данные конфигурации среды выполнения.
3.Скомпилированная конфигурация интерпретатора CPython.
Обе структуры данных, PyPreConfig и PyConfig, определяются в Include cpython initconfig.h.
Книги для программистов: https://t.me/booksforits
76 Конфигурация и ввод
Конфигурация предварительной инициализации
Конфигурация предварительной инициализации существует отдельно от конфигурации среды выполнения, так как ее свойства относятся к операционной системе или окружению пользователя.
PyPreConfig имеет три основные функции:
1.Настройка распределителя памяти Python.
2.Настройка локали LC_CTYPE системной или предпочитаемой пользователем локалью.
3.Настройка режима UTF-8 (PEP 540).
Тип PyPreConfig содержит следующие поля (все они относятся к типу int):
zz allocator: выбор распределителя памяти — например, PYMEM_ALLOCATOR_ MALLOC. Чтобы получить дополнительную информацию о распределителе памяти, выполните команду ./configure --help.
zz configure_locale: LC_CTYPE присваивается локаль, выбранная пользователем. Если значение равно 0, то coerce_c_locale и coerce_c_locale_warn
также присваивается 0.
zz coerce_c_locale: если поле содержит 2, принудительно ввести локаль C. Если значение равно 1, прочитать локальный контекст LC_CTYPE, чтобы принять решение о его принудительном использовании.
zz coerce_c_locale_warn: если значение отлично от нуля, при принудительном применении локали C выдается предупреждение.
zz dev_mode: включение режима разработки.
zz isolated: включение изолированного режима. sys.path не содержит ни каталог скрипта, ни каталог веб-пакетов пользователя.
zz legacy_windows_fs_encoding (только для Windows): если значение отлично от нуля, режим UTF-8 отключается, а для кодировки файловой системы Python устанавливается значение mbcs.
zz parse_argv: если значение отлично от нуля, использовать аргументы командной строки.
zz use_environment: если значение больше нуля, использовать переменные среды.
zz utf8_mode: если значение отлично от нуля, включить режим UTF-8.
Книги для программистов: https://t.me/booksforits