Python 在 python 3 但不在 python 2 中工作的循环相对导入
Python circular relative imports working in python 3 but not python 2
这在 python 3 中有效,但在 python 2(版本 2.7)中发出 ImportError:
Shell 命令:
$> python main.py
main.py
import mymodule
mymodule.KlassX().talk_klass_y()
mymodule.KlassY().talk_klass_x()
mymodule/__init__.py
from .x import KlassX
from .y import KlassY
mymodule/x.py
from . import y # circular import
def KlassX:
def talk(self):
print('Im in KlassX')
def talk_klass_y(self):
y.KlassY().talk()
mymodule/y.py
from . import x # circular import
def KlassY:
def talk(self):
print('Im in KlassY')
def talk_klass_x(self):
x.KlassX().talk()
您可能已经注意到,我将循环导入编写为相对导入,因为这是对包内导入的推荐做法 (PEP-0328)。
我也试过做绝对导入:
from mymodule import y # in mymodule/x.py
from mymodule import x # in mymodule/y.py
但这仅适用于 python 3 而不适用于 python 2(因为相同的 ImportError)。
我可以让它在 python 2 中工作的唯一方法是使用具有以下不推荐符号的相对导入:
import y # in mymodule/x.py
import x # in mymodule/y.py
我真的不喜欢它,因为 "import somemodule" 作为相对导入仅在 python 2 中有效,因为在 python 3 中它总是被强制为绝对导入。
而且我不明白为什么这个符号:
from mymodule import x
# or
from . import x
在 python 2 和 3 中都被接受,表现不同。
有线索吗?
我应该如何在 python 2 中正确执行循环导入?
这在 python 3 中有效,但在 python 2(版本 2.7)中发出 ImportError:
Shell 命令:
$> python main.py
main.py
import mymodule
mymodule.KlassX().talk_klass_y()
mymodule.KlassY().talk_klass_x()
mymodule/__init__.py
from .x import KlassX
from .y import KlassY
mymodule/x.py
from . import y # circular import
def KlassX:
def talk(self):
print('Im in KlassX')
def talk_klass_y(self):
y.KlassY().talk()
mymodule/y.py
from . import x # circular import
def KlassY:
def talk(self):
print('Im in KlassY')
def talk_klass_x(self):
x.KlassX().talk()
您可能已经注意到,我将循环导入编写为相对导入,因为这是对包内导入的推荐做法 (PEP-0328)。
我也试过做绝对导入:
from mymodule import y # in mymodule/x.py
from mymodule import x # in mymodule/y.py
但这仅适用于 python 3 而不适用于 python 2(因为相同的 ImportError)。
我可以让它在 python 2 中工作的唯一方法是使用具有以下不推荐符号的相对导入:
import y # in mymodule/x.py
import x # in mymodule/y.py
我真的不喜欢它,因为 "import somemodule" 作为相对导入仅在 python 2 中有效,因为在 python 3 中它总是被强制为绝对导入。 而且我不明白为什么这个符号:
from mymodule import x
# or
from . import x
在 python 2 和 3 中都被接受,表现不同。
有线索吗? 我应该如何在 python 2 中正确执行循环导入?