如何近似"导入包。*"在Python中

时间:2017-10-03 19:31:21

标签: python python-import

我正在编写一个可以解析由消息组成的二进制协议的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中静态导入它们

1 个答案:

答案 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列表。