如何使这些相对进口在Python 3工作?(How do I make these relative

2019-08-19 12:19发布

我有一个看起来像这样的目录结构:

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 * from . import *在这些情况都不是WonderfulThing进口。 我也试着from ..foo import * ,这引起了一个错误“试图相对进口超出顶层包”。

我读过的文档和PEP,我不能工作,如何使这项工作。 任何援助将不胜感激。

澄清/编辑:好像我可能已经被误解的方式__all__在包工作。 我用它一样的模块,

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

但在看文档又似乎表明, __all__只可在包被用来指定模块默认情况下,进口的姓名; 似乎没有要任何方式包括什么,这不是一个模块。

它是否正确?

编辑:非通配符导入失败( cannot import name WonderfulThing )。 试图from . import foo from . import foo失败了,但import foo工作。 不幸的是, dir(foo)显示什么。

Answer 1:

编辑:我没有误解的问题:没有__all__并不仅仅局限于模块。

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

如果你真的想导入一大把的东西,它可能是最好做from project import foo ,然后用用的东西foo.WonderfulThing的,而不是做一个import * ,然后使用WonderfulThing直接。

然而回答你直接的问题,从导入__init__文件中second.py你这样做:

from . import WonderfulThing

要么

from . import *


文章来源: How do I make these relative imports work in Python 3?