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

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

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

38 ответов

12 просмотров

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

паттерн 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.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта