2

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

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

project/foo/__init__.py我从 中导入类first.pysecond.py然后third.py将它们放入__all__.

first.py在named中有一个类WonderfulThing,我想在 in 中使用它second.py,并且想通过导入*from来导入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)什么也没显示。

4

1 回答 1

3

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

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

如果你真的要导入很多东西,最好是先做from project import foo,然后用withfoo.WonderfulThing来代替做an import *,然后WonderfulThing直接用。

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

from . import WonderfulThing

或者

from . import *
于 2009-10-17T08:18:59.933 回答