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

如何用Python自动化检查IntEnum中未被引用的遗留错误码?

自动化检查IntEnum错误码的未引用项

方案一:调用系统grep命令(高效适合类Unix环境)

grep是文本搜索的高效工具,适合大规模项目场景。可以用Python的subprocess模块批量调用grep,快速收集未被引用的错误码。

实现思路

  1. 枚举ErrorCodes类的所有成员名称
  2. 对每个名称,调用grep在项目目录中搜索(排除错误码定义文件本身,避免误判)
  3. 收集grep返回无匹配结果的错误码

代码示例

import subprocess
from your_module import ErrorCodes

# 项目根目录,根据实际路径修改
PROJECT_ROOT = "./"
# 错误码定义文件的绝对路径,用于排除自身
EXCLUDE_FILE = "/path/to/your/error_codes.py"

unused_codes = []

for code_name in ErrorCodes.__members__:
    # 构造grep命令:递归搜索所有.py文件,排除定义文件,匹配完整标识符
    cmd = [
        "grep",
        "-r",
        "--include=*.py",
        f"--exclude={EXCLUDE_FILE}",
        f"\\b{code_name}\\b",  # \b确保匹配完整的错误码名称,避免部分匹配
        PROJECT_ROOT
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    # grep返回码1表示未找到匹配,0表示找到,其他为执行错误
    if result.returncode == 1:
        unused_codes.append(code_name)

print(f"未被引用的错误码共{len(unused_codes)}个:")
for code in unused_codes:
    print(code)

方案二:用Python标准库实现(跨平台无依赖)

如果需要跨平台支持(比如Windows),或者不想依赖外部命令,可以用os.walk遍历文件,结合正则表达式完成搜索。

优化思路(关键提升效率)

直接逐个检查9000个错误码会重复遍历所有文件,效率极低。反过来先收集所有文件中出现的错误码名称,再和枚举成员对比,只需遍历一次文件:

  1. 遍历项目中所有.py文件,排除错误码定义文件
  2. 用正则提取所有出现的错误码名称
  3. 对比ErrorCodes的成员,找出未出现在提取结果中的名称

代码示例

import os
import re
from your_module import ErrorCodes

PROJECT_ROOT = "./"
EXCLUDE_FILE = "/path/to/your/error_codes.py"
# 正则匹配错误码名称:匹配独立的大写下划线标识符
# 如果项目中引用方式是ErrorCodes.XXX,可改为re.compile(r"ErrorCodes\.([A-Z_]+)")
CODE_PATTERN = re.compile(r"\b([A-Z_]{2,})\b")

# 收集所有被引用的错误码名称
referenced_codes = set()

for root, _, files in os.walk(PROJECT_ROOT):
    for file in files:
        if not file.endswith(".py"):
            continue
        file_path = os.path.join(root, file)
        if file_path == EXCLUDE_FILE:
            continue
        try:
            with open(file_path, "r", encoding="utf-8") as f:
                content = f.read()
                matches = CODE_PATTERN.findall(content)
                referenced_codes.update(matches)
        except UnicodeDecodeError:
            print(f"跳过编码错误的文件:{file_path}")

# 筛选未被引用的错误码
unused_codes = [code for code in ErrorCodes.__members__ if code not in referenced_codes]

print(f"未被引用的错误码共{len(unused_codes)}个:")
for code in unused_codes:
    print(code)

注意事项

  • 正则表达式可根据项目实际的错误码引用方式调整,确保精确匹配,避免误判其他同名标识符
  • 对于超大型项目,可通过多线程/多进程进一步提升遍历和搜索速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:28:39