如何遍历/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值,跳过")
代码逐段解释
- 文件遍历与读取:用
glob.glob获取modules下的所有py文件,再用with open安全读取内容,指定utf-8编码避免不同系统的乱码问题。 - AST语法树解析:
ast.parse把源码转换成抽象语法树,这样我们就能静态分析代码结构,不用执行模块。 - 收集函数名称:遍历AST树,把所有
FunctionDef类型的节点(也就是函数定义)的名称收集到集合里,方便后续判断赋值目标是否是函数。 - 寻找command属性赋值:遍历所有赋值语句,检查赋值目标是不是
函数名.command的形式:- 目标必须是
ast.Attribute类型(比如Command1_1.command) - 属性的主体
target.value必须是函数名(ast.Name类型,且在之前收集的函数集合里) - 属性名
target.attr必须是command
- 目标必须是
- 解析属性值:用
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
相关产品推荐
相关产品推荐

