如何在 Python 中近似 "import package.*"

How to approximate "import package.*" in Python

我正在编写一个 Python 程序,可以解析由消息组成的二进制协议。每条消息都有一个标识符,后跟特定类型的数据。我已经构建了我的应用程序,以便每个消息类型都由一个 (sub)class 表示,位于我的包内它自己的模块中:

messages/
   __init__.py
   MessageTypeOne.py
   MessageTypeTwo.py
   ...

从我的主文件(在同一个包中,但我认为这不重要)我想做相当于

import package.*

也就是说,我希望加载所有模块类型,但 导入到本地命名空间(即不是 from package import * 会做的)。我不想明确列出消息类型(只需添加一个文件就足够了),但是使用类似于 from bla import * 中的 __all__ 构造的东西是可以接受的。

我找到了一种通过循环 os.listdir(__path__)importlib.import_module()'ing 每个找到的文件来完成此操作的方法,但这感觉过于 hacky...是否有更优雅的方法来这样做?

更新: 根据用途(例如解码记录或发送单个消息),我并不总是想导入每种消息类型,因此在 __init__.py 中静态导入它们是不可取的

我可能会让 __init__.py 进行导入:

# in __init__.py
from . import MessageTypeOne
from . import MessageTypeTwo
...

如果你不想这样做,你可以使用 __import__:

__import__('package', fromlist=['*'])

这执行与 from package import * 相同的初始化,但实际上没有绑定本地名称空间中的任何名称。请注意,它不会初始化 from package import * 不会初始化的任何子模块,因此您仍然需要在 __init__.py.

中配置 __all__ 列表