困惑于Python子子包

4
正如标题所说,我对子子包感到困惑。我的包结构如下:
draw \
    __init__.py

    base \
        __init__.py
        utils.py
        events.py
        master.py
        basegui.py

现在,draw.base.events的第一行是以下内容:
import draw.base.utils as _utils

draw.base 的第一行是:

from draw.base.events import Event, RenderEvent, InputEvent, MouseEvent, KeyboardEvent

使用IDLE检查代码是否存在语法错误:

import draw.base as base

会产生以下AttributeError

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import draw.base
  File "Z:\Eigene Dateien\Eigene Dokumente\Python\draw\base\__init__.py", line 4, in <module>
    import draw.base.events as events
  File "Z:\Eigene Dateien\Eigene Dokumente\Python\draw\base\events.py", line 10, in <module>
    import draw.base.utils  as _utils
AttributeError: 'module' object has no attribute 'base'

有人能解释一下问题是什么吗?

1
draw.base是一个单独的文件吗?否则,我不明白你所说的“draw.base的第一行是什么意思”。 - Manny D
1
我相信他指的是draw/base/__init__.py文件的第一行。 - Shawn Chin
1个回答

2
为了在draw.base.events中导入draw.base.utils,Python需要先导入draw.base,但此时并没有draw.base。您可以将import draw.base.utils替换为import utils(在2.7、3.x中也可以使用from ..base import utils,或者使用from __future__ import absolute_import),以打破循环依赖关系。请注意保留HTML标记。

使用“import draw.base <<newline>> import draw.base.utils”也不起作用,使用“import .utils”也不起作用(包括 future 导入)。 (Python 2.7) - Niklas R
我需要在draw\__init__.py中导入draw.base吗? - Niklas R
import draw.base 无论如何都不会起作用。import .utils 是语法错误,只能使用 from ..base import utils - wRAR
我本想避免使用 from xx import yy,因为我更喜欢另一种语法。但是看来无法避免了。;) - Niklas R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接