# 更详细的代码分析
import ast
import re
from pathlib import Path
def detailed_analysis(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
content = ''.join(lines)
issues = []
# 1. 检查代码行长度
for i, line in enumerate(lines, 1):
if len(line.rstrip()) > 100:
issues.append(f'第{i}行过长: {len(line.rstrip())}字符')
# 2. 检查TODO/FIXME等标记
for i, line in enumerate(lines, 1):
if 'TODO' in line or 'FIXME' in line or 'XXX' in line or 'HACK' in line:
issues.append(f'第{i}行包含未完成标记: {line.strip()}')
# 3. 检查异常处理
try:
tree = ast.parse(content)
for node in ast.walk(tree):
if isinstance(node, ast.ExceptHandler):
if node.type is None:
issues.append(f'第{node.lineno}行使用裸except语句')
elif isinstance(node.type, ast.Name) and node.type.id == 'Exception':
issues.append(f'第{node.lineno}行捕获过于宽泛的异常: Exception')
except:
pass
# 4. 检查魔法数字
magic_numbers = re.findall(r'\b\d+\b', content)
magic_numbers_count = len([n for n in magic_numbers if int(n) not in [0, 1, 2]])
if magic_numbers_count > 10:
issues.append(f'过多魔法数字: {magic_numbers_count}个')
# 5. 检查注释密度
comment_lines = sum(1 for line in lines if line.strip().startswith('#'))
total_lines = len(lines)
comment_ratio = comment_lines / total_lines if total_lines > 0 else 0
if comment_ratio < 0.1:
issues.append(f'注释密度过低: {comment_ratio:.1%}')
# 6. 检查导入语句
import_issues = []
for i, line in enumerate(lines, 1):
if line.strip().startswith('import ') or line.strip().startswith('from '):
if '*' in line:
import_issues.append(f'第{i}行使用了通配符导入: {line.strip()}')
issues.extend(import_issues)
# 7. 检查函数和变量的命名
try:
tree = ast.parse(content)
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
if len(node.name) < 3:
issues.append(f'第{node.lineno}行函数名过短: {node.name}')
elif '_' not in node.name and not node.name[0].isupper():
# 检查是否是驼峰命名而非蛇形命名
if any(c.isupper() for c in node.name):
issues.append(f'第{node.lineno}行函数命名不规范: {node.name} (应为蛇形命名)')
except:
pass
print(f'文件: {filepath}')
print(f'总行数: {len(lines)}')
print(f'发现的问题数量: {len(issues)}')
print()
# 分类显示问题
categories = {
'代码格式': [],
'异常处理': [],
'注释和文档': [],
'导入问题': [],
'命名规范': [],
'其他问题': []
}
for issue in issues:
if '过长' in issue or '字符' in issue:
categories['代码格式'].append(issue)
elif '异常' in issue:
categories['异常处理'].append(issue)
elif '注释' in issue or '未完成标记' in issue:
categories['注释和文档'].append(issue)
elif '导入' in issue or '通配符' in issue:
categories['导入问题'].append(issue)
elif '命名' in issue:
categories['命名规范'].append(issue)
else:
categories['其他问题'].append(issue)
for category, cat_issues in categories.items():
if cat_issues:
print(f'{category} ({len(cat_issues)}个):')
for issue in cat_issues[:5]: # 只显示前5个
print(f' - {issue}')
if len(cat_issues) > 5:
print(f' ... 还有{len(cat_issues)-5}个问题')
print()
return len(issues)
if __name__ == "__main__":
issue_count = detailed_analysis('src/data_access/cache.py')
print(f'总计发现 {issue_count} 个问题')