Я знаю, что Python препятствует любой ситуации, которая может привести вас к циклическому импорту.Но я хотел понять внутреннюю часть Python о том, почему from-imports кажутся произвольно менее прощающими, чем обычный импорт в ситуациях кругового импорта.
Например, этот код компилируется:
# main.py
import CommonUtil
# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass
# util.py
import commonutil
class Util:
# some code that uses commonutil.CommonUtil
pass
Но этот кодне:
# main.py
import CommonUtil
# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass
# util.py
from commonutil import CommonUtil
class Util:
# some code that uses CommonUtil
pass
Traceback (most recent call last):
File "main.py", line 1, in <module>
import CommonUtil
File "commonutil.py", line 1, in <module>
import util
File "util.py", line 1, in <module>
from commonutil import CommonUtil
ImportError: cannot import name CommonUtil
Вы не столкнетесь с ошибками компилятора, если не попытаетесь использовать соответствующие классы до завершения всех операций импорта.Но когда вы пытаетесь сделать псевдоним, это не получается.Может кто-нибудь объяснить, что происходит внутри Python, что приводит к тому, что эта ошибка поднимает голову только при использовании from-import?И во-вторых, есть ли простой способ обойти это?(Помимо очевидного «извлечения общего кода из третьего модуля», который я, скорее всего, сделаю в любом случае.)