Python循环相对导入工作在python 3但不是python 2

Python circular relative imports working in python 3 but not python 2

这在python 3中有效,但在python 2(版本2.7)中会发出importError:

壳牌命令:

1
$> python main.py

Me.Py

1
2
3
4
import mymodule

mymodule.KlassX().talk_klass_y()
mymodule.KlassY().talk_klass_x()

mymodule/初始版本

1
2
from .x import KlassX
from .y import KlassY

MyMeals/X.Py

1
2
3
4
5
6
7
8
from . import y  # circular import

def KlassX:
    def talk(self):
        print('Im in KlassX')

    def talk_klass_y(self):
        y.KlassY().talk()

MyMeals/Y.Py

1
2
3
4
5
6
7
8
from . import x  # circular import

def KlassY:
    def talk(self):
        print('Im in KlassY')

    def talk_klass_x(self):
        x.KlassX().talk()

正如您可能已经注意到的,我已经将循环导入写为相对导入,因为它是建议在包(PEP-0328)内进行导入的操作。

我还尝试绝对进口:

1
2
from mymodule import y  # in mymodule/x.py
from mymodule import x  # in mymodule/y.py

但这只适用于python 3,而不适用于python 2(因为存在相同的importerror)。

在python 2中,我唯一能让它工作的方法是使用具有以下未经协商的表示法的相对导入:

1
2
import y  # in mymodule/x.py
import x  # in mymodule/y.py

我真的不喜欢它,因为"导入somemodule"作为相对导入只在python 2中有效,因为在python 3中,它总是被强制为绝对导入。我不明白为什么这些符号:

1
2
3
from mymodule import x
# or
from . import x

这在python 2和3中都是可以接受的,其行为是不同的。

有什么线索吗?在python 2中如何正确地执行循环导入?


查看简要摘要:https://gist.github.com/databook/40bf84d5870c41a77dc6