Python 3.15 можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Python 3.15 добавляет несколько возможностей, которые видны в небольшом коде, а не только во внутренних оптимизациях интерпретатора. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Списки изменений Python длинные, и новичку трудно отделить полезный синтаксис от деталей реализации и экспериментальных API. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте один файл с пятью независимыми демонстрациями новых возможностей Python 3.15. Проверка: файл запускается в Python 3.15, печатает ожидаемые значения и не использует сторонние библиотеки.
получить Python 3.15 и проверить sys.version_info. Не расширяйте проект до первого успешного запуска.
каждая функция печатает подписанный результат. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте собственный пример для одного новшества и подпишите, какую проблему оно решает. Так копирование станет практикой.
Как устроен учебный проект Python 3.15
Каждый пример оформлен отдельной функцией, поэтому его можно запустить, изменить и сравнить независимо от остальных. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Версия | получить Python 3.15 и проверить sys.version_info | интерпретатор сообщает версию 3.15 |
| Примеры | запустить пять коротких функций по очереди | каждая функция печатает подписанный результат |
| Изменение | заменить одно значение в каждом примере | поведение меняется только в выбранном блоке |
| Сравнение | запустить совместимый фрагмент в старой версии | видно, какой синтаксис или API относится именно к 3.15 |
Контрольные точки: версия, примеры, изменение и сравнение. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
python3.15 --version. Если команда показывает более раннюю версию, новый синтаксис нельзя проверять этим процессом. Сохраните команду запуска и ожидаемый вывод.Собираем рабочий пример шаг за шагом
Материал сверялся с официальной страницей What’s New in Python 3.15 для ветки документации 3.15. Для изолированного запуска используйте uv run --python 3.15 python demo.py: uv загрузит подходящий интерпретатор отдельно от системного Python. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
lazy import json
MISSING = sentinel("MISSING")
def unpacking() -> list[int]:
groups = [[1, 2], [10, 20]]
return [*group for group in groups]
def frozen_settings():
return frozendict({"theme": "dark", "font": 16})
def find(value=MISSING):
return "аргумент не передан" if value is MISSING else value
print(unpacking())
print(frozen_settings())
print(find(), find(None))
print(json.loads('{"ready": true}'))
# Пятый эксперимент запускается из терминала:
# python -m profiling.sampling run demo.py- Распаковка внутри list comprehension превращает две группы в список
[1, 2, 10, 20]. sentinelпозволяет отличить отсутствующий аргумент от явно переданногоNone.- Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Новые возможности решают разные задачи: синтаксис сокращает преобразования коллекций, а новые типы делают намерение программы явным. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Отложенные импорты по PEP 810 не следует включать в каждый учебный файл автоматически: они меняют момент выполнения кода модуля. frozendict полезен там, где словарь должен оставаться неизменным и хешируемым. Sentinel решает старую проблему, когда None является допустимым значением. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Встроенная поддержка статистического профилирования относится к измерению работающей программы. Она не ускоряет код сама, а помогает увидеть горячие участки до оптимизации.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| Синтаксис | распаковка в comprehensions и lazy imports меняют выполнение кода | интерпретатор 3.15 принимает файл без SyntaxError |
| Новые типы | frozendict и sentinel выражают ограничения данных | попытка изменить frozendict завершается ожидаемой ошибкой |
| Инструменты | профилирование показывает, где программа тратит время | измеряется реальная функция, а не пустой пример |
Не переносите демонстрационный API в рабочий проект только потому, что он новый. Сначала сформулируйте проблему. Если обычного словаря достаточно, frozendict не добавит ценности. Если None не используется как данные, отдельный sentinel тоже может быть лишним. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
None в функцию find и сравните результат с вызовом без аргумента. Именно это различие оправдывает sentinel. Меняйте одно условие за прогон, чтобы видеть причину.Проверяем проект и добавляем свою функцию
Добавьте к файлу шестой блок: функцию, которая пытается изменить frozendict и ловит TypeError с коротким объяснением. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: файл запускается в Python 3.15, печатает ожидаемые значения и не использует сторонние библиотеки.
- Измените правило: добавьте собственный пример для одного новшества и подпишите, какую проблему оно решает. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- интерпретатор сообщает версию 3.15
- каждая функция печатает подписанный результат
- поведение меняется только в выбранном блоке
- видно, какой синтаксис или API относится именно к 3.15
Новую версию полезно изучать через контраст: старый способ, новый способ и условие, при котором изменение действительно улучшает код. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Для рабочего проекта сначала проверьте поддержку версии библиотеками и окружением деплоя. Учебный файл можно запускать отдельно уже сейчас, не меняя системный Python. Для закрепления откройте в проекте Python с uv, в статье про pytest и в разборе Ruff.
Как изучить тему в Кодике
Повторите коллекции, значения по умолчанию и импорты, иначе новый синтаксис будет выглядеть как набор трюков. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Списки, словари, функции и значения None | Объясните вход и выход функции. |
| 2. Инструмент | Чтение What’s New и запуск конкретной версии через uv | Повторите команду по памяти. |
| 3. Проект | Пять независимых демонстраций с ожидаемым выводом | Проверьте два сценария. |
| 4. Рефакторинг | Сравнение старого и нового решения одной задачи | Разделите ввод, логику и вывод. |
После эксперимента оставьте себе таблицу «возможность, проблема, ограничение», а не список новых имён. Базовый синтаксис закрепите через курс Python.
Команда python может указывать на 3.13 или другую версию. Сначала печатайте sys.version.
Библиотеки и хостинг могут ещё не поддерживать 3.15. Проверяйте матрицу совместимости.
Одна ошибка останавливает весь файл и скрывает остальные. Держите блоки в отдельных функциях.
Синтаксис оправдан только понятной задачей и улучшением читаемости.
Что получится в итоге

Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.
Зачем нужен отдельный sentinel, если есть None?
None может быть допустимым значением аргумента, а sentinel обозначает именно отсутствие значения.
Можно ли изменить frozendict после создания?
Нет. Это неизменяемое отображение, и попытка присвоить ключ должна завершиться ошибкой.
Что проверять первым, если Python 3.15 не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект Python 3.15 работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.