You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态导入解析:如何在__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:27:11