Google Python 代码注释与文档字符串风格完全指南
本文基于 Google 官方 Python 风格指南系统梳理 Python 代码中注释、文档字符串、TODO 的完整规范包含正反示例与最佳实践可作为团队代码规范与个人知识库归档。一、为什么需要统一的注释风格注释是代码可读性的核心保障。好的注释不描述代码本身在做什么而是解释为什么这么做、业务意图、边界条件、潜在坑点。统一的注释风格能让团队成员快速读懂彼此的代码降低维护成本。Google Python 风格指南对注释的核心原则文档字符串Docstring对外说明「怎么用」写给调用者看行内注释Inline Comment对内说明「为什么」写给维护者看不做代码翻译假设读者懂 Python不需要解释基础语法二、文档字符串Docstrings基础规范2.1 基本格式Python 使用三双引号作为文档字符串标准格式遵循 PEP 257禁止使用三单引号。结构要求第一行是一句话摘要不超过 80 字符以句号、问号或感叹号结尾如果内容更多空一行后续写详细说明详细内容与开头引号保持相同缩进位置。2.2 正反示例✅ 正确python运行def fetch_data(key: str) - dict: Fetches data from cache by key. Retrieves cached data for the given key. Returns an empty dict if the key does not exist. ❌ 错误python运行def fetch_data(key: str) - dict: # 错误使用单引号 Fetches data. def fetch_data(key: str) - dict: 错误首行就换行没有摘要行 Fetches data from cache. 三、模块级文档字符串3.1 规范要求每个 Python 文件开头在导入语句之前必须有模块级文档字符串描述文件的整体内容、用途、导出的类和函数、使用示例。文件开头还应包含项目对应的许可证声明。3.2 标准模板python运行A one-line summary of the module or program, terminated by a period. Leave one blank line. The rest of this docstring should contain an overall description of the module or program. Optionally, it may also contain a brief description of exported classes and functions and/or usage examples. Typical usage example: foo ClassFoo() bar foo.function_bar() 3.3 测试模块的特殊说明测试文件的模块文档字符串不是必需的。只有当存在额外信息时才添加例如测试的特殊运行方式不寻常的初始化模式对外部环境的依赖✅ 测试模块示例python运行This blaze test uses golden files. You can update those files by running blaze run //foo/bar:foo_test -- --update_golden_files from the google3 directory. ❌ 无意义的文档字符串不要写python运行Tests for foo.bar. # 没有提供任何新信息禁止使用四、函数与方法文档字符串4.1 什么时候必须写文档字符串满足以下任一条件的函数强制要求文档字符串属于公开 API函数体有一定规模逻辑不直观、非显而易见4.2 核心原则文档字符串要让读者不看函数实现代码就能正确调用。描述调用语法和语义不描述实现细节但如果实现细节会影响使用比如副作用必须注明。4.3 标准三段式结构Args参数说明逐个列出参数名冒号后接描述。如果代码没有类型注解描述中必须包含类型。*args和**kwargs也要列出。Returns返回值说明描述返回值的语义和类型。如果函数只返回None可以省略此节。生成器函数用Yields:而不是Returns:。Raises异常说明列出所有与接口相关的异常及描述。不要列出因 API 误用而抛出的异常比如参数校验错误因为那不属于接口契约的一部分。4.4 完整标准示例python运行def fetch_smalltable_rows( table_handle: smalltable.Table, keys: Sequence[bytes | str], require_all_keys: bool False, ) - Mapping[bytes, tuple[str, ...]]: Fetches rows from a Smalltable. Retrieves rows pertaining to the given keys from the Table instance represented by table_handle. String keys will be UTF-8 encoded. Args: table_handle: An open smalltable.Table instance. keys: A sequence of strings representing the key of each table row to fetch. String keys will be UTF-8 encoded. require_all_keys: If True only rows with values set for all keys will be returned. Returns: A dict mapping keys to the corresponding table row data fetched. Each row is represented as a tuple of strings. For example: {bSerak: (Rigel VII, Preparer), bZim: (Irk, Invader), bLrrr: (Omicron Persei 8, Emperor)} Returned keys are always bytes. If a key from the keys argument is missing from the dictionary, then that row was not found in the table (and require_all_keys must have been False). Raises: IOError: An error occurred accessing the smalltable. 4.5 重写方法的特殊规则子类重写父类方法时如果加了override装饰器且重写没有改变语义可以不写文档字符串如果重写后语义有变化、增加了副作用必须写文档字符串说明差异写See base class.也是允许的但override本身就足够说明文档在父类。✅ 正确示例python运行from typing_extensions import override class Child(Parent): override def do_something(self): pass # 有 override可以不写文档字符串五、类文档字符串5.1 规范要求类定义下方必须有文档字符串描述类的用途。公开属性不包括 property需要在Attributes:节中列出格式与函数的Args:一致。5.2 标准示例python运行class SampleClass: Summary of class here. Longer class information... Longer class information... Attributes: likes_spam: A boolean indicating if we like SPAM or not. eggs: An integer count of the eggs we have laid. def __init__(self, likes_spam: bool False): Initializes the instance based on spam preference. Args: likes_spam: Defines if instance exhibits this preference. self.likes_spam likes_spam self.eggs 05.3 异常类命名与文档异常类的文档字符串应该描述异常本身代表什么而不是在什么上下文抛出。✅ 正确python运行class OutOfCheeseError(Exception): No more cheese is available.❌ 错误python运行class OutOfCheeseError(Exception): Raised when no more cheese is available. # 冗余表述六、块注释与行内注释6.1 使用场景复杂操作在操作前写几行块注释说明整体思路不直观的技巧在行尾加行内注释解释代码评审时需要解释的逻辑现在就写注释。6.2 格式要求行内注释与代码之间至少间隔 2 个空格#号后至少跟 1 个空格再写注释文字绝对不要描述代码本身在做什么假设读者懂 Python。✅ 正确示例python运行# We use a weighted dictionary search to find out where i is in # the array. We extrapolate position based on the largest num # in the array and the array size and then do binary search to # get the exact number. if i (i - 1) 0: # True if i is 0 or a power of 2. process(i)❌ 反面典型废话注释python运行# BAD: Now go through the b array and make sure whenever i occurs # the next element is i1这种注释只是把代码翻译成了人话没有任何信息增量反而增加阅读负担。七、标点、拼写与语法7.1 基本要求注释要像叙述文本一样可读正确使用大小写和标点完整句子比句子片段更易读行尾短注释可以非正式但全篇风格要保持一致注意拼写和语法避免低级错误。7.2 为什么如此重要虽然标点和拼写看似小事但源代码的清晰度和可读性对长期维护至关重要。规范的注释能显著降低团队沟通成本和新人上手成本。八、TODO 注释规范8.1 什么时候用 TODO用于临时方案、短期解决方案、「够用但不完美」的代码。8.2 标准格式plaintext# TODO: 引用链接 - 说明文字TODO全大写后面跟冒号冒号后是上下文引用最好是 bug 链接而不是人名然后用连字符-引出说明文字。✅ 正确python运行# TODO: crbug.com/192795 - Investigate cpufreq optimizations.❌ 不推荐的旧写法python运行# TODO(crbug.com/192795): Investigate cpufreq optimizations. # TODO(yourusername): Use a * here for concatenation operator.8.3 禁止事项不要用个人用户名作为 TODO 的上下文TODO 要可追溯、可跟进指向 issue 或 bug 最佳如果写「将来某天做某事」务必给出具体日期或具体触发事件。九、日志与错误消息中的文字规范9.1 日志字符串规范日志函数第一个参数用字符串字面量不要用 f-string。原因部分日志实现会将原始模式字符串作为可查询字段避免为未启用的日志级别浪费渲染时间。✅ 正确python运行logging.info(Current $PAGER is: %s, os.getenv(PAGER, default))❌ 错误python运行logging.info(fCannot write to home directory, $HOME{homedir!r})9.2 错误消息三原则异常信息、用户提示必须满足消息必须精确匹配实际错误情况插入的变量内容要清晰可识别便于自动化处理比如 grep 检索。✅ 正确python运行if not 0 p 1: raise ValueError(fNot a probability: {p})❌ 反面示例python运行try: os.rmdir(workdir) except OSError: # 问题想当然认为是目录已删除实际可能因为其他原因失败 logging.warning(Directory already was deleted: %s, workdir)十、核心原则总结10.1 文档字符串 vs 行内注释表格类型受众内容重点位置文档字符串调用者 / 使用者怎么用、入参出参、异常函数 / 类 / 模块开头行内注释维护者 / 阅读者为什么这么做、坑点、技巧代码旁 / 行尾10.2 五条黄金法则不翻译代码不说「这行在循环」说「为什么要循环、循环解决什么问题」公开 API 必有文档字符串别人不看你源码就能用参数、返回值、异常三段式结构统一快速检索TODO 可追溯挂 issue 链接不写人名保持一致性局部风格比全局规范更重要与周边代码风格统一。10.3 最后的话BE CONSISTENT. 风格指南的意义是让大家拥有共同的编码词汇从而专注于表达内容而非表达方式。如果你修改已有代码先花几分钟观察周边代码的风格。如果周围用_idx后缀你也用如果注释有特殊格式你也保持一致。局部一致性的优先级甚至高于全局规范 —— 突兀的风格差异会打断读者的阅读节奏。

相关新闻

python中的数据类型

python中的数据类型

今日的主要内容为:Python的基本数据类型 Python整数进制转换Python数据类型转换函数一、Python的基本数据类型1、数字类型(1)int例:1、2、3、4、5、6...等等,在Python中,整数变量的定义可以使用int进行定义…

2026/7/23 21:19:30阅读更多 →
2026果蔬剥皮机产业分析:农产品深加工升级下全自动果蔬剥皮设备的增长路径

2026果蔬剥皮机产业分析:农产品深加工升级下全自动果蔬剥皮设备的增长路径

当前全球农产品精深加工产业扩容、预制菜行业规模化扩张需求持续释放,传统人工果蔬剥皮在生产效率、损耗率、标准化程度维度的短板日益凸显,全自动果蔬剥皮机凭借低损耗、高产能的核心优势,成为果蔬加工生产线的核心预处理设备。据中国食品工…

2026/7/23 21:17:30阅读更多 →
TVP5151视频解码芯片中断机制详解与嵌入式系统配置实战

TVP5151视频解码芯片中断机制详解与嵌入式系统配置实战

1. 项目概述与中断机制的价值在嵌入式视频处理系统的开发中,如何让主控芯片(MCU或MPU)高效、实时地感知视频解码芯片的状态变化,是一个直接影响系统性能和稳定性的核心问题。想象一下,你正在设计一个行车记录仪或者一个…

2026/7/23 21:17:30阅读更多 →
新能源储能与充电设施出海通信架构实战:全球射频自适应与高可用拨号守护机制

新能源储能与充电设施出海通信架构实战:全球射频自适应与高可用拨号守护机制

摘要:随着新能源储能系统与快充基础设施的大规模出海,中国制造的设备正全面接入海外当地的复杂通信网络。然而,跨国部署中频段碎片化、海外运营商通信制式高度非标准化以及野外弱网环境下的链路僵死,构成了出海设备交付后的重大运…

2026/7/23 22:39:42阅读更多 →
打破“无坐标、慢响应”魔咒:AI Agent驱动的毫秒级态势推演与决策闭环

打破“无坐标、慢响应”魔咒:AI Agent驱动的毫秒级态势推演与决策闭环

一、行业共性技术桎梏传统安防系统缺失像素原生三维坐标体系。二维监控画面无统一空间基准。跨摄像机跟踪目标坐标漂移轨迹断裂。静态数字孪生模型更新延迟分钟级。态势分析依赖人工回看事后处置响应滞后。有源定位硬件部署周期长存在电磁泄密风险。多路视频融合时序不同步数据…

2026/7/23 22:39:42阅读更多 →
Sheared LLaMA: Accelerating Language Model Pre-training via Structured Pruning 解读

Sheared LLaMA: Accelerating Language Model Pre-training via Structured Pruning 解读

一、论文基本信息 论文题目:Sheared LLaMA: Accelerating Language Model Pre-training via Structured Pruning 方法名称:LLM-Shearing 作者:Mengzhou Xia、Tianyu Gao、Zhiyuan Zeng、Danqi Chen 发表:ICLR 2024&#xff0c…

2026/7/23 22:39:42阅读更多 →
像素即坐标:打通跨摄像机追踪断层,重构全域空间连续建模底座

像素即坐标:打通跨摄像机追踪断层,重构全域空间连续建模底座

像素即坐标:打通跨摄像机追踪断层,重构全域空间连续建模底座一、行业技术固有断层痛点传统监控体系像素仅承载画面可视化信息,无空间坐标映射逻辑。单摄像机视野边界割裂,跨摄像机追踪目标ID漂移轨迹断裂。静态数字孪生依赖前置建…

2026/7/23 22:39:42阅读更多 →
具身智能重构高墙透明治理:视频孪生+无感空间感知,打造司法监所全域穿透防线

具身智能重构高墙透明治理:视频孪生+无感空间感知,打造司法监所全域穿透防线

具身智能重构高墙透明治理:视频孪生无感空间感知,打造司法监所全域穿透防线一、司法监所传统安防核心技术桎梏墙体隔断形成多层物理遮挡催生全域监管盲区。二维监控机位独立时序割裂无法实现跨镜头跟踪。静态数字孪生依赖前置建模虚实时空错位不具备动态…

2026/7/23 22:39:42阅读更多 →
2026十大生产制造ERP:警惕出货量误导,基于MES集成度与工单闭环逻辑重排

2026十大生产制造ERP:警惕出货量误导,基于MES集成度与工单闭环逻辑重排

在制造业数字化转型的深水区,企业决策者正面临一个尴尬的悖论:市面上号称“高产能”的ERP系统层出不穷,出货量榜单更是让人眼花缭乱,但真正落地后,生产现场的管理效率却并未显著提升。许多企业陷入了“报表数据漂亮&am…

2026/7/23 22:37:41阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →