如何在Python 3中使这些相对导入工作?

时间:2009-10-17 02:46:47

标签: python import python-3.x relative

我有一个如下所示的目录结构:

project/
        __init__.py
        foo/
            __init.py__
            first.py
            second.py
            third.py
        plum.py

project/foo/__init__.py我从first.pysecond.pythird.py导入课程并将其放入__all__

first.py中有一个名为WonderfulThing的课程,我想在second.py中使用该课程,并希望通过从*导入foo来导入。 (这个问题的范围超出了我为什么要这样做,假设我有充分的理由。)

second.py我已尝试from .foo import *from foo import *from . import *,并且在这些情况下均未导入WonderfulThing。我还尝试了from ..foo import *,这引发了一个错误“尝试相对导入超出顶级包”。

我已经阅读了文档和PEP,我无法弄清楚如何使这项工作。任何帮助将不胜感激。

澄清/编辑:似乎我可能误解了__all__在包中的工作方式。我使用它和模块一样,

from .first import WonderfulThing
__all__ = [ "WonderfulThing" ]

但是再次查看文档似乎表明__all__只能在包中使用,以指定默认情况下要导入的模块的名称;似乎没有任何方法可以包含任何不是模块的东西。

这是对的吗?

修改:非通配符导入失败(cannot import name WonderfulThing)。尝试from . import foo失败,但import foo有效。不幸的是,dir(foo)没有显示任何内容。

1 个答案:

答案 0 :(得分:3)

编辑:我确实误解了这个问题:没有__all__不仅限于模块。

一个问题是为什么要进行相对导入。在这里做from project.foo import *没有错。其次,对{foo}的__all__限制不会阻止您执行from project.foo.first import WonderfulThing,或只是from .first import WonderfulThing,这仍然是最佳方式。

如果你真的想导入很多东西,那么最好做from project import foo,然后用foo.WonderfulThing代替import *进行WonderfulThing然后使用{直接{1}}。

但是要回答您的直接问题,要从second.py中的__init__文件导入,请执行以下操作:

from . import WonderfulThing

from . import *