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

如何遍历/modules/目录下的Python文件并获取函数特定属性?

提取modules目录下带command属性的函数

我来帮你搞定这个函数属性提取的需求,基于你已经写的AST片段,咱们把它补全,这样就能准确找出modules目录下所有带有command属性的函数了。

完整实现代码

import ast
import glob

# 遍历modules目录下的所有.py文件
for module_path in glob.glob('modules/*.py'):
    print(f"Processing module: {module_path}")
    # 安全读取文件内容,指定编码避免乱码
    with open(module_path, "rt", encoding="utf-8") as f:
        module_content = f.read()
    
    # 解析成AST语法树,filename参数用于错误提示
    tree = ast.parse(module_content, filename=module_path)
    
    # 第一步:先收集当前模块里所有函数的名称
    function_names = set()
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            function_names.add(node.name)
    
    # 第二步:遍历所有赋值语句,寻找给函数添加command属性的情况
    for node in ast.walk(tree):
        if isinstance(node, ast.Assign):
            # 遍历赋值目标(支持多赋值的情况)
            for target in node.targets:
                # 检查是否是「函数名.command」的赋值形式
                if (isinstance(target, ast.Attribute) 
                    and isinstance(target.value, ast.Name) 
                    and target.value.id in function_names 
                    and target.attr == 'command'):
                    func_name = target.value.id
                    # 安全解析command属性的值(避免使用eval带来的风险)
                    try:
                        command_value = ast.literal_eval(node.value)
                        print(f"✅ 找到目标函数:{func_name},对应的command值:{command_value}")
                    except ValueError:
                        print(f"⚠️ 无法解析函数{func_name}的command值,跳过")

代码逐段解释

  1. 文件遍历与读取:用glob.glob获取modules下的所有py文件,再用with open安全读取内容,指定utf-8编码避免不同系统的乱码问题。
  2. AST语法树解析:ast.parse把源码转换成抽象语法树,这样我们就能静态分析代码结构,不用执行模块。
  3. 收集函数名称:遍历AST树,把所有FunctionDef类型的节点(也就是函数定义)的名称收集到集合里,方便后续判断赋值目标是否是函数。
  4. 寻找command属性赋值:遍历所有赋值语句,检查赋值目标是不是函数名.command的形式:
    • 目标必须是ast.Attribute类型(比如Command1_1.command)
    • 属性的主体target.value必须是函数名(ast.Name类型,且在之前收集的函数集合里)
    • 属性名target.attr必须是command
  5. 解析属性值:用ast.literal_eval解析属性的值,这个方法比eval安全,只会解析字面量(比如列表、字符串、数字等),不会执行任意代码。

针对你示例代码的效果

对于你给出的模块示例:

def Command1_1():
    True
Command1_1.command = ['cmd1']
def Command1_2():
    True

运行代码后会输出:

Processing module: modules/xxx.py
✅ 找到目标函数:Command1_1,对应的command值:['cmd1']

而Command1_2因为没有command属性,不会被识别出来。

注意事项

  • 这个方法只能识别顶层直接赋值的command属性,如果是在函数内部给自身赋值,或者通过变量间接赋值(比如func = Command1_1; func.command = ...),静态AST解析是找不到的。
  • 如果你的PyBot.msggrp是路径前缀,只需要把module_path替换成PyBot.msggrp + module_path即可适配你的路径逻辑。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:06:15