动态导入解析:如何在__init__.py中识别被导入类(fromList)?
在__init__.py中识别被导入的具体成员
可以实现这个需求,核心思路是利用Python的inspect模块追踪调用栈,解析触发模块导入的语句,提取出被导入的成员名称。
实现步骤
1. 编写test/init.py代码
import inspect # 定义示例类 class ClassA: pass class ClassB: pass class ClassC: pass def extract_imported_members(): # 遍历调用栈,定位导入语句所在的模块帧 for frame_info in inspect.stack(): frame = frame_info.frame code_obj = frame.f_code # 仅处理模块级别的代码执行(即导入语句所在的上下文) if code_obj.co_name == "<module>": try: # 获取当前模块的源代码行 source_lines = inspect.getsource(code_obj).splitlines() for line in source_lines: stripped_line = line.strip() # 匹配"from test import ..."格式的语句 if stripped_line.startswith("from test import"): # 拆分出导入的成员部分 import_segment = stripped_line.split("import", 1)[1].strip() # 处理可能的别名(如ClassA as A),仅保留原成员名 member_names = [name.split("as")[0].strip() for name in import_segment.split(",")] return member_names except OSError: # 若无法获取源代码(如动态生成的代码),返回空列表 return [] return [] # 模块加载时自动检测并输出 imported = extract_imported_members() if imported: print(f"当前被导入的成员:{imported}")
2. 编写load.py代码
from test import ClassA, ClassB
3. 运行测试
执行python load.py,控制台会输出:
当前被导入的成员:['ClassA', 'ClassB']
注意事项
- 该方案依赖解析源代码,若导入语句是通过
__import__()等动态方式生成,或者代码被压缩/混淆,将无法正确识别。 - 若
test模块被多次导入,每次加载都会执行检测逻辑,可通过添加模块级标记(如_already_checked = False)避免重复输出。 - 不同Python版本的调用栈结构可能有细微差异,需在目标环境中测试适配。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

