Python如何计算两段代码差异 实现忽略注释与空白字符的校验方案
忽略注释与空白的代码智能校验和Python实现
实现思路
对比仅存在注释、空白差异的代码时,核心逻辑是先对代码做归一化预处理,过滤所有无关内容后再计算哈希校验和,即可实现无关变更的忽略。
具体实现
依赖引入
仅需要Python标准库,无需额外安装依赖:
import re import hashlib
代码归一化函数
这里提供Python、C/Java两类常见语言的归一化实现,可自行扩展其他语言规则:
def normalize_python_code(code: str) -> str: # 移除三引号包裹的多行注释 code = re.sub(r'(\'\'\'(.|\n)*?\'\'\'|\"\"\"(.|\n)*?\"\"\")', '', code, flags=re.DOTALL) # 移除#开头的单行注释 code = re.sub(r'#.*', '', code) # 移除所有空白字符,若需保留语义相关空格可替换为 re.sub(r'\s+', ' ', code) code = re.sub(r'\s+', '', code) return code def normalize_c_java_code(code: str) -> str: # 移除/* */包裹的多行注释 code = re.sub(r'/\*(.|\n)*?\*/', '', code, flags=re.DOTALL) # 移除//开头的单行注释 code = re.sub(r'//.*', '', code) # 移除所有空白字符 code = re.sub(r'\s+', '', code) return code
校验和计算函数
def calc_smart_checksum(code: str, lang: str = "python") -> str: # 不同语言对应不同归一化规则 normalize_map = { "python": normalize_python_code, "c": normalize_c_java_code, "java": normalize_c_java_code } normalize_func = normalize_map.get(lang) if not normalize_func: raise ValueError(f"不支持的语言类型:{lang}") normalized_code = normalize_func(code) # 使用sha256计算校验和,可替换为md5等其他哈希算法 return hashlib.sha256(normalized_code.encode("utf-8")).hexdigest()
使用示例
# 仅存在注释、空白差异的两段Python代码 code_version1 = """ def calculate_sum(x, y): # 计算两个数的和 result = x + y return result """ code_version2 = """ def calculate_sum(x, y): result = x + y return result # 返回计算结果 """ checksum1 = calc_smart_checksum(code_version1) checksum2 = calc_smart_checksum(code_version2) print(checksum1 == checksum2) # 输出:True
优化提示
- 如果需要保留字符串字面量内部的内容不被误处理,可改用语法解析库提取代码的语法节点,过滤注释节点后再生成归一化代码,准确率更高
- 可根据实际场景调整空白处理规则,比如只移除行首尾空白、换行符,保留代码内部的必要空格
内容的提问来源于stack exchange,提问作者Maria Laura Brzezinski Meyer
相关产品推荐
相关产品推荐

