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 中正确执行循环导入?

看看简要总结:https://gist.github.com/datagrok/40bf84d5870c41a77dc6