Python - 从一个包中导入所有内容时,我可以导入特定的 类

Python - Can I import specific classes when importing all from a package

我有一个包设置了树状结构,如

pkg\  
    __init__.py  
    module1.py  
        Class11  
        Class12  
    module2.py  
        Class21  
        function21  

我希望特定的 类 和函数位于全局命名空间中,这样当我使用

启动我的脚本时
from pkg import *

我将能够直接使用Class11、Class12 和function21。这可能吗?它背后的动机是允许在小脚本或交互模式下快速、轻量地使用。众所周知,对于较长的脚本,人们不会使用 import all 并正确遍历包结构。

编辑:我可以在 pkg 的 __init__.py 中导入 Class11、Class12 和 function21,但是这样,当我执行常规 import pkg 时,我仍然可以通过 pkg.Class11 而不是正确的 pkg.module1.Class11。如果我不做 import *.

,最好我希望 pkg.module1.Class11 成为唯一的方法

当然可以。 * 表示 "everything".* 如果您不想要所有内容,而是想要特定的名称列表,只需使用这些名称:

from pkg import Class11, Class21, function21

当然,这假定 pkg 已经从其子模块中导入了这些名称。但如果不是这样,您的 * 导入也不会起作用。

如果那不是真的,但你想知道如何让它成为真的,你只需在 pkg/__init__.py 中做类似的事情:

from .module1 import Class11, Class12
from .module2 import Class21, function21

或者,也许:

from .module1 import __all__ as _all1
from .module2 import __all__ as _all2
from .module1 import *
from .module2 import *

__all__ = _all1 + _all2

* 嗯,不完全是 "everything"。如果有__all__,则表示"every name in __all__";如果不是,则表示 "every name that doesn't start with _"。但是对于我们的目的来说足够接近了。

是的,你可以。看看 Flask 做了什么 here:

基本上,您可以像这样在 __init__.py 中导入函数和 类:

from .app import Flask, Request, Response
from .config import Config

现在我们可以做:

from Flask import Flask ,Request

像这样设置您的__init__.py

from .module1 import Class11, Class12
from .module2 import Class21, function21