我正在编写一个可以解析由消息组成的二进制协议的Python程序。每条消息都有一个标识符,后跟特定于类型的数据。我构建了我的应用程序,以便每个消息类型由(子)类表示,该类位于我的包中的自己的模块中:
messages/
__init__.py
MessageTypeOne.py
MessageTypeTwo.py
...
从我的主文件(在同一个包中,但我认为不重要)我想做相同的
import package.*
也就是说,我希望加载所有模块类型,但不导入到本地命名空间(即不是from package import *
会做什么)。我不想明确列出消息类型(只需添加一个文件就足够了),但使用与__all__
中from bla import *
构造类似的东西是可以接受的。
我找到了一种方法可以通过循环os.listdir(__path__)
和importlib.import_module()
找到每个找到的文件来实现这一目标,但这感觉过于苛刻......还有更多吗?优雅的方式来做到这一点?
更新:
根据使用情况(例如,记录或发送单个邮件的解码),我并不总是想要导入每种邮件类型,因此不希望在__init__.py
中静态导入它们
答案 0 :(得分:0)
我可能会__init__.py
进行导入:
# in __init__.py
from . import MessageTypeOne
from . import MessageTypeTwo
...
如果您不想这样做,可以使用__import__
:
__import__('package', fromlist=['*'])
这将执行与from package import *
相同的初始化,但不会实际绑定本地命名空间中的任何名称。请注意,它不会初始化from package import *
不会的任何子模块,因此您仍需要在__all__
中配置__init__.py
列表。