如何在 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__
列表
我正在编写一个 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__
列表