如何用sed/awk提取继承BaseClass的Python子类及函数
使用Awk提取继承自BaseClass的子类及函数(含文件路径)
下面是一个Awk脚本,可以批量处理Python代码文件,自动提取所有继承自BaseClass的子类名称、函数声明,并输出对应文件路径:
完整Awk脚本
将以下内容保存为extract_subclasses.awk:
BEGIN { in_target_class = 0 class_name = "" } FILENAME != prev_filename { if (prev_filename != "") { print "---" } print "文件路径: " FILENAME prev_filename = FILENAME in_target_class = 0 class_name = "" } # 匹配继承BaseClass的类定义行 /^class [A-Za-z0-9_]+.*\(.*BaseClass.*\):/ { split($0, parts, /class |\(/) class_name = parts[2] print "子类定义: " $0 in_target_class = 1 next } # 捕获目标类内的函数声明 in_target_class && /^[[:space:]]*def [A-Za-z0-9_]+\(/ { sub(/^[[:space:]]*/, "", $0) print " 函数: " $0 } # 遇到非目标类时退出跟踪状态 /^class / && !/BaseClass/ { in_target_class = 0 }
使用方法
1. 处理单个/多个文件
在终端运行:
awk -f extract_subclasses.awk path/to/file1.py path/to/file2.py
2. 递归遍历整个代码库
结合find命令处理所有子目录下的.py文件:
find /path/to/your/code -name "*.py" -exec awk -f extract_subclasses.awk {} +
示例效果
假设存在文件src/utils/data_processor.py,内容如下:
class BaseClass: def base_method(self): pass class DataProcessor(BaseClass): def load_dataset(self, path): pass def preprocess(self, data): return data class TempClass: def temp_func(self): pass
运行脚本后输出:
文件路径: src/utils/data_processor.py 子类定义: class DataProcessor(BaseClass): 函数: def load_dataset(self, path): 函数: def preprocess(self, data): ---
注意事项
- 脚本假设类定义为单行格式(如
class X(BaseClass):),如果你的代码有多行继承定义(比如跨线写父类),需要调整正则表达式适配。 - 会捕获类内所有以
def开头的函数,包括特殊方法(如__init__、__str__)。 - 输出中的
---分隔符用于区分不同文件的结果,方便阅读。
内容的提问来源于stack exchange,提问作者Bitdiot
相关产品推荐
相关产品推荐

