Python如何通过import *直接导入包内的类而非对应模块
问题原因
你遇到的报错和__init__.py的配置无关,核心有两个问题:
- Python语法明确禁止在函数、类等局部作用域中使用
import *语法,只能在模块顶层(无缩进的全局位置)使用该语法,这是你抛出SyntaxError: import * only allowed at module level的直接原因。 - 你之前的认知有误:
__all__变量不仅可以配置模块名,完全支持配置类、函数、全局变量等所有你想对外暴露的对象名称,你当前写的collections/__init__.py的导入和__all__配置逻辑本身是正确的。
标准实现方案
第一步:优化__init__.py导入(可选,避免导入冲突)
给模块导入加上相对导入标识.,避免和Python标准库的collections模块混淆:
# root/collections/__init__.py from .collection1 import Collection1 from .collection2 import Collection2 from .collection3 import Collection3 __all__ = ['Collection1', 'Collection2', 'Collection3']
第二步:调整db.py的导入位置
把import *语句移到模块顶层即可:
# root/db.py from root.collections import * def test_collections(): a = Collection1() b = Collection2() # 后续业务逻辑 test_collections()
特殊场景解决方案(函数内导入需求)
如果确实有必须在函数内部导入所有类的场景,可以通过importlib手动实现动态导入:
# root/db.py import importlib def test_collections(): # 动态导入collections包 collections_pkg = importlib.import_module('root.collections') # 遍历__all__把所有类注册到全局命名空间 for cls_name in collections_pkg.__all__: globals()[cls_name] = getattr(collections_pkg, cls_name) a = Collection1() test_collections()
注:该方案仅适合特殊动态场景,常规开发优先使用顶层导入的方案,可读性和性能更优
内容的提问来源于stack exchange,提问作者Wonseok the Great
相关产品推荐
相关产品推荐

