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

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

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

38 ответов

11 просмотров

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
28
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
10
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Вопрос на перед, на следующую пятницу. Сколько строк кода можно вешать на одного программиста, понятно что если проект хорошо написан то можно и миллион. Но есть же где то пре...
AlekseyK Kluchnikov
31
Немного оффтопа: а кто на чем сидит для осдева в плане ide/редактора? Последнее время сидел на vscode, но я его прям не могу нормально воспринимать, перешел на сlion, но меня...
Evg Resh
29
Кстати, кто-нибудь извращался с делфи под вайном?
Serjone
11
Карта сайта