Python — допускает циклический импорт

#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. Это не сработало бы на компьютере другого разработчика. Ты упускаешь что-то важное. Возможно, это тонкое, решающее различие, которое вы не замечаете, потому что вы недостаточно знаете, чтобы осознать его важность. Может быть, что-то простое, например, может быть, другой разработчик запускает более новую версию своего кода, а вы смотрите на старую, ошибочную версию, или, может быть, то, что они запустили, на самом деле не загружало ни один из проблемных модулей.