#python
Вопрос:
Есть ли в Python какая-то опция, позволяющая циклический импорт? Я отвечаю за развертывание чьего-то кода, он полон различных плохих практик, включая циклический импорт. Естественно, когда я запускаю его, я получаю Исключения. Я исправил их все раньше, чтобы проверить, нет ли других проблем, и тогда все работает нормально. Это не вопрос о специфике самого кругового импорта, я полностью понимаю, почему их не должно быть, как их исправить, обходные пути и т. Д.
Они продемонстрировали, что он каким — то образом будет работать на их машине без исключения, но мне не разрешен доступ к их конфигурации или изменение их кода в рабочей среде-мне разрешено только развертывание.
Пример кода ниже показывает тот же шаблон/ошибку (извините, мне не разрешено вставлять фактический код, но такова природа проблемы).:
a.py
from b import function_b def function_a(): print("a")
b.py
from a import function_a def function_b(): print("b")
и ошибка будет выглядеть примерно так:
python3.9 a.py Traceback (most recent call last): File "/private/tmp/a.py", line 1, in lt;modulegt; from b import function_b File "/private/tmp/b.py", line 1, in lt;modulegt; from a import function_a File "/private/tmp/a.py", line 1, in lt;modulegt; from b import function_b ImportError: cannot import name 'function_b' from partially initialized module 'b' (most likely due to a circular import) (/private/tmp/b.py)
Комментарии:
1. Как же тогда работает код в первую очередь?
2. Циклический импорт уже разрешен по умолчанию. Вам придется приложить особые усилия, чтобы отключить их. Проблема не в этом.
3. @Крис, можете ли вы добавить обратную связь для ошибки, которую вы получаете, и код, который ее вызывает? Если код не запускается, у вашего коллеги нет другого выбора, кроме как сотрудничать
4. «насколько я знаю, циклический импорт всегда будет проходить через исключение» — неправда. Циклический импорт автоматически не создает исключений. Циклический импорт вызывает проблемы с порядком инициализации, и эти проблемы приводят к исключениям. Если, благодаря тщательному дизайну или счастливой случайности, вам удастся организовать все так, чтобы материал всегда инициализировался до того, как что-то будет искать его, вы можете использовать циклический импорт, который работает, но, как правило, лучше избегать циклического импорта.
5. Это не сработало бы на компьютере другого разработчика. Ты упускаешь что-то важное. Возможно, это тонкое, решающее различие, которое вы не замечаете, потому что вы недостаточно знаете, чтобы осознать его важность. Может быть, что-то простое, например, может быть, другой разработчик запускает более новую версию своего кода, а вы смотрите на старую, ошибочную версию, или, может быть, то, что они запустили, на самом деле не загружало ни один из проблемных модулей.