
🛠 PEP 810: эволюция импортов в PythonИстория внедрения lazy import — это не просто рассказ о новой фиче, а настоящий мастер-класс по тому, как сообщество Python умеет работать над ошибками и находить баланс между производительностью и стабильностью.📉 Почему PEP 690 (первая попытка) провалилсяВ 2022 году Meta предложила радикальный подход: флаг -L, делающий все импорты ленивыми по умолчанию. Управляющий совет (Steering Council) наложил вето по веским причинам:— Фрагментация: Это создало бы «два разных Python», где библиотеки вели бы себя по-разному.— Скрытые сайд-эффекты: Огромное количество legacy-кода завязано на логике, которая выполняется строго в момент импорта.— Сложность отладки: Ошибки инициализации могли «всплывать» в самых неожиданных местах рантайма.🚀 Почему PEP 810 (текущий) — это победаДизайн был полностью переосмыслен. Вместо неявного глобального флага мы получили явный синтаксический сахар:1. Явность (Opt-in): Вводится новое «мягкое» ключевое слово lazy. Вы сами помечаете тяжелые зависимости, которые не нужны при старте.# Python 3.15+lazy import torchlazy from matplotlib import pyplot as plt2. Прокси-объекты вместо магии диктов: В PEP 690 предлагалось менять внутреннее устройство dict. PEP 810 изящнее — он создает легкий прокси-объект. Реальный импорт триггерится только в момент первого обращения к атрибуту объекта.3. Производительность: Результаты Meta (Cinder) и Hudson River Trading подтверждают: время старта CLI-инструментов сокращается до 70%, а потребление памяти — до 40%.⚠️ Технические нюансы и ограниченияКак и у любого мощного инструмента, у lazy import есть свои «но»:— Wildcard запрещены: Конструкция lazy from module import * вызовет SyntaxError, так как интерпретатору нужно знать список имен заранее.— Deferred Errors: ModuleNotFoundError теперь вылетит не в начале скрипта, а в строке, где вы впервые вызвали torch.save(). Это нужно учитывать при написании долгоживущих сервисов.— Thread Safety: Python сохраняет глобальную блокировку импорта (




