我有一个如下所示的目录结构:
project/
__init__.py
foo/
__init.py__
first.py
second.py
third.py
plum.py
在project/foo/__init__.py
我从first.py
,second.py
和third.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)
没有显示任何内容。
答案 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 *