170 похожих чатов

Есть ли какие-нибудь доводы ЗА то, чтобы импортировать модули только

там, где они впервые используются? Есть, что почитать на эту тему? (сам я строго следую заветам Гвидо — импортирую все строго в начале файла)

38 ответов

3 просмотра

В смысле использовать локальные импорты внутри функций?

паттерн factory и производные от него - зачем вам тянуть дерево зависимостей модулей (а может еще и инициализацию оных) в паять если вы не будете это использовать

Александр-Астафьев Автор вопроса
Dmitry
паттерн factory и производные от него - зачем вам ...

Вот есть реальный юзкейс, где импорт модулей настолько долгий?

Александр Астафьев
В принципе и

Есть только один сценарий, когда это может быть оправдано. Чтобы избежать проблемы циклических импортов, если невозможно устранить циклические зависимости между модулями.

Александр Астафьев
Вот есть реальный юзкейс, где импорт модулей насто...

речь не только про долгое, импорт может закончится и неудачей, если не стоят какие-то доп. вещи в системе в моменте инициализации модуля

Александр-Астафьев Автор вопроса
Alex
Есть только один сценарий, когда это может быть оп...

Самое главное — избегание ошибок импортов в рантайме. Я вот щас открыл исходники OpenShot, и тут тоже импортируют аж на 183 строке. Глазам больно

Александр Астафьев
Вот есть реальный юзкейс, где импорт модулей насто...

Вообще есть, но это довольно специфическая ситуация и уже скорее относится к низкоуровневым оптимизациям. Софт, который запускается по требованию и должен запускаться быстро. Например некоторые увесистые CLI или какие-нибудь лямбды.

Александр Астафьев
Самое главное — избегание ошибок импортов в рантай...

А при чем здесь ошибки импорта? Ошибки импорта ты обрабатываешь там же где импортируешь модуль, если предполагается что этот модуль опциональный.

Александр Астафьев
Самое главное — избегание ошибок импортов в рантай...

Это обычно рядом с остальными импортами обрабатывается. Импорт заворачивается в try-except ImportError, и в случае ошибки импортируется заглушка или какой-нибудь флаг отсутствия модуля выставляется

Dmitry
речь не только про долгое, импорт может закончится...

за такие модули, которые выполняют логику в момент импорта нужно бить по рукам и гнать вон из профессии.

Александр-Астафьев Автор вопроса
Alex
А при чем здесь ошибки импорта? Ошибки импорта ты ...

Не, допустим, я импортирую что-то в середине скрипта. При запуске полскрипта отработает, а на импорте ImportError. Если бы импорт был сразу, скрипт даже не запустился бы — я про это

Александр Астафьев
Не, допустим, я импортирую что-то в середине скрип...

Если бы импорт был сразу, то ты точно так же мог бы обработать ошибку импорта в месте импорта

Александр Астафьев
Некрасиво это :/

Нет, это вполне распространенная практика.

Александр-Астафьев Автор вопроса
Alex
Нет, это вполне распространенная практика.

Распространенная, но... некрасивая

Александр Астафьев
Распространенная, но... некрасивая

А гонять импорты на каждый вызов функции стало быть красивая?

Alex
за такие модули, которые выполняют логику в момент...

это может быть сделано намеряно. я так делаю для unstable фичей, чтобы в проде не дай бог (без спец выставления переменных среды) не включили - fail fast

Александр Астафьев
Распространенная, но... некрасивая

Обычно такие условные импорты прячут за фасад пакета

Dmitry
это может быть сделано намеряно. я так делаю для u...

я немного о другом. например модуль во время импорта загружает датасет или еще какую-нибудь хрень творит.

Alex
я немного о другом. например модуль во время импор...

ну малоли что он творит - например модуль будет использовать zlib в 100% случаев. Что б сразу не проверить что zlib есть в системе?

Александр-Астафьев Автор вопроса
Alex
я немного о другом. например модуль во время импор...

А вот модуль должен вообще датасеты грузить? Мож в модуле функцию или метод init() написать, которую и заворачивать в try/except, а не сам импорт?

Александр Астафьев
Распространенная, но... некрасивая

Красивее, чем импорты внутри функций, ошибки которых вообще никак не обрабатываются

Александр Астафьев
А вот модуль должен вообще датасеты грузить? Мож в...

> Мож в модуле функцию или метод init() написать, которую и заворачивать в try/except, а не сам импорт? звучит как хрень. какую проблему это "заворачивание" должно решать?

Alex
за такие модули, которые выполняют логику в момент...

так, тут уже у меня вопрос, ты про такое говорил? так у меня выглядит файл init.py https://pastebin.com/zv8WV0Ph

Кудряш Khaidarov
так, тут уже у меня вопрос, ты про такое говорил? ...

не совсем, но у твоего кода другая проблема.

Александр-Астафьев Автор вопроса
Alex
> Мож в модуле функцию или метод init() написать, ...

Если модуль делает что-то тяжёлое, да ещё и упасть при этом может, предлагается обернуть его импорт в try/except. Но зачем обрабатывать импорт, когда в модуле можно вынести это что-то тяжёлое в какую-нибудь функцию, и в вызывающем коде отлавливать эксепшены уже в ней

ты про engine, base и session?

Александр Астафьев
Если модуль делает что-то тяжёлое, да ещё и упасть...

ключевое здесь "если". если модуль делает что-то тяжелое в момент импорта и нет возможности его изменить, то это проблема, которую нужно решать. в остальных случаях это не должно становиться практикой по-умолчанию.

Кудряш Khaidarov
ты про engine, base и session?

конкретно про engine который зависит от глобальной конфигурации, которая грузится в момент импорта.

Alex
конкретно про engine который зависит от глобальной...

то есть, его надо обернуть в функцию, к примеру: get_engine(db_url): return create_engine(db_url)

Alex
и какой в этом смысл?

тоже над этим думаю не совсем понимаю как исправить

Кудряш Khaidarov
то есть, его надо обернуть в функцию, к примеру: ...

1. конфигурацию следует загружать например в точке входа в твое приложение. 2. на основе конфигурации создавать engine 3. sessionmaker можно создать глобально и связать его с engine в момент вызова, а можно создавать там же где и engine.

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Кто создает тут ботов для телеграмм групп ?
Antskup
8
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
2
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Карта сайта