Как я уже писал, в Python 3.15 нас ждут lazy imports.
В первом посте я описал основные фичи. Прочитайте его перед продолжением.
Во втором посте настало время посмотреть на плохие части.
Детали PEP, которые мы не осветили прошлый раз
Во-первых, из очевидного:
lazy import может быть использован только на уровне модуля, в других местах - он будет вызывать ошибку синтаксиса. Но, что забавно, lazy import не может быть использован внутри даже try блоков.Во-вторых, я не уточнил, как будет работать
__lazy_modules__, а там дичь.Мы можем указывать
__lazy_modules__ = ['os', 'typing'] в любой версии питона. Очевидно, что работать как ленивые они будут только в 3.15+, в остальных - будет просто неиспользуемый атрибут. Но штука в том, что в разных версиях питона библиотеки будут работать по-разному. Но! Он будет ленивым, только если он может быть ленивым. То есть, если он находится внутри класса, функции, try, тд - он не станет ленивым. Удачи в дебаге, короче.Ну и самое забавное, мы можем управлять глобальным стейтом всех импортов через
-X lazy_imports=none|normal|all и так же через переменную окружения PYTHON_LAZY_IMPORTS. Что оно значит? Отключаем все lazy импорты | все работает так, как написано | все импорты ленивые. Мы можем управлять тем, как работают импорты через переменную окружения!! Перечитайте, если вы тоже не поняли. Я вот не сразу понял.Внедрение в питон
В stdlib питона уже активно используют lazy импорты. Однако, внутри уже появились циклические импорты. Потому что теперь так можно сделать случайно. И специально. Да, ленивые импорты могут помогать избегать циклических импортов. В некоторых режимах работы.
Теперь stdlib больше не работает в режиме
-X lazy_imports=none.О чем развернулась жаркая дискуссия, прочитать которую я всем советую: https://github.com/python/cpython/issues/149321
Но и режим
-X lazy_imports=all все сломал. Теперь с ним некоторые библиотеки начали работать по-другому. Например:
$ PYTHON_LAZY_IMPORTS=normal ./python -c "import shutil; print(shutil._BZ2_SUPPORTED)"
False
$ PYTHON_LAZY_IMPORTS=all ./python -c "import shutil; print(shutil._BZ2_SUPPORTED)"
True
Так как импорт становится ленивым, он больше не проверяет есть ли на самом деле библиотека
_bz2 у вас. А просто всегда возвращает True. Что делать - пока никто не знает: https://github.com/python/cpython/issues/150167Вот в такой ситуации мы все оказались. Зато теперь некоторые скрипты будут запускаться быстрее, потому что импорты в некоторых местах стали ленивыми. Иногда, не точно. Почему нельзя было использовать импорт внутри функции? Я не знаю.
Мое отношение к данной фиче можно только охарактеризовать словами вечного инструмента
wemake-python-styleguide: https://github.com/wemake-services/wemake-python-styleguide/issues/3639Обсуждение: я даже не знаю, честно. Давайте просто обнимемся в комментах.
| Поддержать | YouTube | GitHub | Чат |