开发者们常常面对这样一个难题:代码写得飞快,但注释却懒得添加。等到回头整理时,早已忘记当初写代码的思路。
现在有了DeepSeek 自动注释脚本,你只需要专注于代码实现,注释交给它就好!
今天我们不仅讲解这款神器的强大功能,还将逐步解析每一部分代码,让你彻底掌握它的工作原理。


💻 脚本整体架构

脚本名称:add_comments.py
脚本功能:

  1. 自动为代码文件添加结构化注释,不改动代码逻辑。
  2. 支持Python、Shell (Bash)、C++、JavaScript、Java等多种编程语言。
  3. 通过DeepSeek API调用,实现精准注释。
  4. 代码风格清晰可读,行内注释和分组注释搭配使用。

🗺️ 脚本架构解析

整个脚本分为以下几个模块:

  1. 脚本说明和依赖导入
  2. API Key 读取模块
  3. 目标代码读取模块
  4. 代码语言检测模块
  5. 代码清理和注释生成模块
  6. 命令行参数解析模块
  7. 注释结果保存模块
  8. 脚本入口

1. 脚本说明和依赖导入

首先是脚本的元信息和依赖导入:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import argparse
import logging
import re
from openai import OpenAI

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

解析:

  • 脚本元信息:指定解释器为 Python 3,支持 UTF-8 编码。
  • 导入模块
    • ossys:用于文件和系统操作。
    • argparse:用于解析命令行参数。
    • logging:日志管理,记录脚本执行状态。
    • re:正则表达式模块,进行字符串清理。
    • openai:调用 DeepSeek API,生成代码注释。
  • 日志配置:设置日志级别为 INFO,便于跟踪执行状态。

2. API Key 读取模块

功能: 从指定文件中读取 DeepSeek API Key。

def read_api_key(api_key_file: str) -> str:
    """从指定文件中读取API密钥"""
    if not os.path.exists(api_key_file):
        raise FileNotFoundError(f"未找到 API Key 文件: {api_key_file}")
    with open(api_key_file, "r", encoding="utf-8") as f:
        key = f.read().strip()
    if not key:
        raise ValueError("API Key 文件为空,请检查文件内容。")
    return key

解析:

  • 检查 API Key 文件是否存在,若不存在则抛出异常。
  • 从文件中读取 API Key,并去除多余空格。
  • 若读取结果为空,则抛出值错误异常。

3. 目标代码读取模块

功能: 读取待注释的代码文件内容。

def read_target_script(script_path: str) -> str:
    """读取目标代码文件内容"""
    if not os.path.exists(script_path):
        raise FileNotFoundError(f"目标代码文件不存在: {script_path}")
    with open(script_path, "r", encoding="utf-8") as f:
        return f.read()

解析:

  • 检查代码文件是否存在,若不存在则报错。
  • 使用 with open() 打开文件,读取完整内容后返回。

4. 代码语言检测模块

功能: 根据文件扩展名自动识别编程语言。

def detect_language(script_path: str) -> str:
    """根据文件扩展名检测编程语言"""
    ext = os.path.splitext(script_path)[1].lower()
    language_map = {
        ".py": "Python",
        ".sh": "Shell",
        ".cpp": "C++",
        ".c": "C",
        ".js": "JavaScript",
        ".java": "Java"
    }
    return language_map.get(ext, "未知语言")

解析:

  • 提取文件扩展名,并通过字典匹配返回相应语言。
  • 若无法匹配,则返回“未知语言”。

5. 代码清理和注释生成模块

功能: 调用 DeepSeek API 生成带注释代码,同时清理不必要的 Markdown 标签。

def clean_markdown_tags(content: str) -> str:
    """清理残留的Markdown标记并保留分组注释"""
    content = re.sub(r'^```[a-zA-Z]*\s*', '', content, flags=re.MULTILINE)
    content = re.sub(r'\n```\s*$', '', content)
    return content.strip()

解析:

  • 使用正则表达式去除代码中的 Markdown 标记,例如:
    • 删除代码块开头的 python、bash 等标记。
    • 删除代码块结尾的 ```标记。

6. 注释生成模块

功能: 使用 DeepSeek API 为代码生成带注释的版本。

def generate_commented_code(api_key: str, script_content: str, language: str) -> str:
    """调用API生成带注释的代码"""
    client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")
    prompt = f"请为以下 {language} 代码添加结构化注释..."
    try:
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role": "user", "content": prompt}]
        )
        return clean_markdown_tags(response.choices[0].message.content)
    except Exception as e:
        logging.error(f"API调用失败: {e}")
        raise

解析:

  • 构造 API 请求并发送。
  • 捕获异常并进行日志记录,防止程序崩溃。

7. 命令行参数解析模块

功能: 使用 argparse 解析命令行参数。

def parse_arguments() -> argparse.Namespace:
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description="自动为代码文件添加结构化注释")
    parser.add_argument("script_path", type=str, help="目标代码文件路径")
    return parser.parse_args()

解析:

  • 简单高效地从命令行获取目标代码文件路径。

8. 脚本入口

功能: 脚本的主执行流程。

if __name__ == "__main__":
    main()

解析:

  • 作为脚本入口调用 main() 函数,确保程序直接运行时才执行,而非作为模块导入时运行。

🎉 总结

DeepSeek 自动注释脚本通过调用 API,快速生成结构化注释,提高代码的可读性和规范性。在团队协作中,这种自动化注释工具能够极大减少人力成本,提升代码质量。

💡 觉得有用吗?赶紧点赞、评论、转发,让更多人受益吧!❤️

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐