当前位置: 首页 > 知识库问答 >
问题:

Python循环相对导入在Python 3中工作但不能在Python 2中工作

潘安邦
2023-03-14

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

Shell命令:

$> python 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()
from mymodule import y  # in mymodule/x.py
from mymodule import x  # in mymodule/y.py

但这只适用于Python3,而不适用于Python2(因为相同的ImportError)。

在Python2中使其工作的唯一方法是使用具有以下不推荐符号的相对导入:

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

我真的不喜欢它,因为“import someModule”作为一个相对导入只在Python2中起作用,因为在Python3中,它总是被迫作为一个绝对导入。我不明白为什么这个符号:

from mymodule import x
# or
from . import x

有线索吗?我应该如何在Python2中正确地执行循环导入?

共有1个答案

暨弘懿
2023-03-14

看一下简要摘要:https://gist.github.com/datagrok/40bf84d5870c41a77dc6

 类似资料:
  • 问题内容: 假设我有以下文件, 现在,如果我跑步,它说。 这是有道理的,并且按照此链接中的以下语句运行: “它将首先在包的目录中查找” 假设我稍微修改了文件结构(添加了一个核心目录): 现在,如果我运行,它将加载内置模块。 同样在第二种情况下,如果必须遵守“ 它将首先在软件包的目录中查找 ” 这样 的语句 ,是否 应该加载本地文件,因为它是“软件包的目录”? 我的术语“包目录”的意义是 明确 的

  • 问题内容: 我有以下代码- 但这给了我输出- 我不明白这一点,为什么不消除它,但是在这种情况下我只尝试了一种。当我最后添加少量内容时,我不会从中删除。为什么? 问题答案: 删除第一个“ Meg”时,即为索引。然后增加,但是由于“ Meg”之一已被删除,因此现在是“ Brain”。因此,您实际上没有检查第二个“ Meg”。 解决问题。您可以在删除元素时减少索引:

  • 问题内容: 我在一起有多个循环,而在最内部的循环中有一个睡眠。例如: 如果您运行该代码,则可能需要等待1秒钟然后再次休眠直到结束,才能获得价值。 但是结果是不同的,它等待10秒钟并打印整行,然后再次等待打印下一行。 我发现打印末尾的逗号导致了此问题。我该如何解决? 问题答案: 由于存在逗号,因此输出缓冲到a为止。 您应在每次打印或使用后冲洗并冲洗缓冲区。 定义您的打印方法: 在行的末尾打印一个

  • 这个方法的问题是它总是返回零。看起来没有使用它的参数。然而,如果我按照下面的方式来写,那么一切都运行得很好。有没有人知道为什么第一种方法不起作用?

  • 我想做的是制作一个快速而肮脏的幻灯片。我的想法是让master div包含一个空白的“master”img标记和一组div,每个div都包含自己的img和span标记。每个图像的源依次设置为主img的源。因此,我开始迭代每个图像,并尝试使用setTimeout()和2秒延迟将其源设置为主img的源。我遇到的问题是,编写代码似乎要等待两秒钟,并且只显示序列中的最后一幅图像。 如果我能得到第二双眼睛来