Python导入一个没有其他子包的子包

Ale*_*lec 5 python packages python-module python-import

我有以下包结构

package
    __init__.py
    sub1
        __init__.py
        foo.py      # Contains class Foo
    sub2
        __init__.py
        bar.py      # Contains class Bar
Run Code Online (Sandbox Code Playgroud)

我希望能够公正import package和有package.Foo和package.Bar,即我想有子包是对用户透明.

问题是导入sub2需要很长时间,许多用户根本不关心sub2中的东西,只想要sub1中的东西.因此,我希望用户能说import package.sub1或from package import sub1到刚刚导入SUB1和SUB2跳跃的进口.

我知道我可以通过package/__init__.py控制来实现第一部分

from .sub1 import *
from .sub2 import *
Run Code Online (Sandbox Code Playgroud)

和具有package/sub1/__init__.py可from .foo import Foo与类似地对于SUB2.但是,即使用户仅尝试导入,也会始终导入sub1和sub2 package.sub1.

相应地,我可以通过package/__init__.py使用与sub1/__init__.py上面相同的空来实现第二部分.但是,然后只是说不import package加载sub1或sub2,所以用户必须显式加载它们然后引用package.sub1.Foo.

理想情况下,解决方案在2.7.10和3.5.0中均可使用,但如果两者都不可能,我将接受其中一个或另一个.

eLR*_*uLL 0

您可以将快捷方式添加到__init__.py模块的:

包/__init__.py

__all__ = [
    ... add everything you want to be listed for this module
    'Foo',
    'Bar',
    ...
]
from package.sub1.foo import Foo
from package.sub2.bar import Bar
Run Code Online (Sandbox Code Playgroud)

现在你应该可以调用:

from package import Bar
Run Code Online (Sandbox Code Playgroud)