查看: 165|回复: 0

Python单行多行注释与docstring规范写法

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
Python 代码注释不是解释器执行逻辑的一部分,但它直接影响可读性、IDE 提示、代码审查和 API 文档生成。下面围绕 Python 的单行注释、多行三引号、docstring,以及函数、类、模块、代码块、行内注释的写法,整理一套可落地的规范。

一、三种基础注释形式

1. 单行注释 #
单行注释以 # 开头,其后的内容被 Python 解释器忽略。常见用途是解释代码功能、调试时临时屏蔽代码、标记 TODO。规范建议 # 后加一个空格,再写注释内容。
  1. # 计算圆的面积(单行注释在代码上方)
  2. radius = 5
  3. area = 3.14 * radius ** 2  # 单行注释在代码右侧
  4. # 调试时临时禁用代码
  5. # print('这行不会执行')
复制代码

不要写废话注释,例如 # 赋值给变量。代码本身能表达清楚时,少加注释。

2. 多行注释(三引号)
Python 没有专门的多行注释语法。三引号(三个单引号或三个双引号)创建的是多行字符串,通常被当作多行注释使用。未赋值给变量时,解释器会忽略它。
  1. '''
  2. 这是一个多行注释的示例
  3. 可以跨越多行
  4. 不会被Python执行
  5. '''
  6. def example_function():
  7.     '''这是函数的文档字符串(docstring)
  8.     用于说明函数的功能和用法
  9.     '''
  10.     pass
  11. '''
  12. 也可以使用三个单引号
  13. 作为多行注释
  14. '''
复制代码

注意:三引号本质是字符串,不是真正的注释语法;函数、类或模块定义后的第一个三引号字符串会成为 docstring。

3. 文档字符串 Docstring
Docstring 通常位于模块、函数、类或方法开头,用三引号包裹,用于解释功能、参数、返回值、异常等信息。它可以通过 __doc__ 访问,也能被 help()、pydoc、Sphinx 等工具解析。
  1. def add(a, b):
  2.     '''Return the sum of two numbers.
  3.     Args:
  4.         a (int): First number.
  5.         b (int): Second number.
  6.     Returns:
  7.         int: Sum of a and b.
  8.     '''
  9.     return a + b
  10. print(add.__doc__)
  11. help(add)
复制代码

输出中会显示该 docstring 内容。多行 docstring 常见格式是:第一行简短描述,空一行,再写详细说明;缩进必须与代码块一致。

二、按代码结构写注释

函数/方法注释
函数或方法的 docstring 应说明功能、参数、返回值,必要时说明异常。它适合帮助其他开发者理解调用方式,也方便 Sphinx、pydoc 生成 API 文档,IDE 如 PyCharm、VSCode 也会显示提示。格式建议统一遵循 PEP 257,或采用 Google、NumPy 等风格。简单函数不必写得很长,但参数和返回值不要漏。
  1. def calculate_area(length, width):
  2.     '''
  3.     计算矩形的面积。
  4.     Args:
  5.         length (float): 矩形的长度。
  6.         width (float): 矩形的宽度。
  7.     Returns:
  8.         float: 矩形的面积(length * width)。
  9.     Raises:
  10.         ValueError: 如果length或width为负数。
  11.     '''
  12.     if length < 0 or width < 0:
  13.         raise ValueError('长度和宽度必须为正数')
  14.     return length * width
复制代码

类注释
类 docstring 用于解释类功能、属性和重要方法,位于类定义之后、方法定义之前。不要只写“这是一个 XX 类”。多行时第一行写简短摘要,再展开说明。
  1. class Rectangle:
  2.     '''表示二维矩形的类。
  3.     该类提供了计算面积和周长的方法,
  4.     并支持比较两个矩形的大小。
  5.     Attributes:
  6.         width (float): 矩形的宽度
  7.         height (float): 矩形的高度
  8.     '''
  9.     def __init__(self, width, height):
  10.         self.width = width
  11.         self.height = height
  12.     def area(self):
  13.         '''计算并返回矩形的面积。'''
  14.         return self.width * self.height
复制代码

模块注释
模块注释通常放在文件开头、import 之前,用三引号包裹,描述模块功能、作者、版本等信息。它可以通过 help() 或 __doc__ 查看,文档工具也会读取。
  1. '''
  2. 这是一个计算器模块
  3. 提供基本的加减乘除运算功能,支持整数和浮点数计算。
  4. 作者: Python学习者
  5. 版本: 1.0.0
  6. 最后更新: 2023-10-01
  7. '''
  8. def add(a, b):
  9.     '''返回两个数的和'''
  10.     return a + b
复制代码

代码块注释
代码块注释用于解释一段连续逻辑,例如复杂算法、业务分支。可以先用三引号写整体说明,也可以使用 # 加分隔线形成块状注释。重点是与代码同步更新,不要为显而易见代码加冗余说明。
  1. '''
  2. 这是一个计算斐波那契数列的函数
  3. 参数:
  4.     n: 要生成的数列项数
  5. 返回值:
  6.     包含n个斐波那契数的列表
  7. '''
  8. def fibonacci(n):
  9.     a, b = 0, 1
  10.     result = []
  11.     for _ in range(n):
  12.         result.append(a)
  13.         a, b = b, a + b
  14.     return result
  15. # ======================================
  16. # 这段代码处理用户登录验证流程:
  17. # 1. 检查用户名是否存在
  18. # 2. 验证密码是否匹配
  19. # 3. 记录登录日志
  20. # ======================================
  21. if user_exists(username):
  22.     if check_password(username, password):
  23.         log_login_attempt(username, True)
  24.         return True
  25.     else:
  26.         log_login_attempt(username, False)
  27.         return False
复制代码

行内注释
行内注释写在代码行末尾或中间,用于快速说明意图。Python 中行内注释前应至少保留两个空格,注释内容要简洁。不要用行内注释解释显而易见的代码。
  1. x = 5  # 初始化计数器
  2. y = x * 2  # 计算双倍值
  3. # 不推荐:
  4. z = x + y  # 把x和y相加
复制代码

三、文档字符串常见风格

Google 风格
Google 风格在参数、返回值、异常等部分使用清晰的分节标题,适合团队协作和代码审查。它与 PEP 8 有细节差异,例如行长度约定可能不同;团队应明确采用哪一套规范,并可用 yapf 等工具辅助格式化。
  1. def calculate_sum(a, b):
  2.     '''计算两个数的和。
  3.     Args:
  4.         a (int): 第一个加数。
  5.         b (int): 第二个加数。
  6.     Returns:
  7.         int: 两个数的和。
  8.     '''
  9.     return a + b
复制代码

关键点是:三重引号、参数类型、返回值说明、函数名 snake_case、4 空格缩进。

NumPy 风格
NumPy 风格常见于科学计算、机器学习、数据分析等场景,强调向量化操作、广播机制、布尔索引和视图,避免 Python 原生循环。写相关代码注释时,应特别说明数组维度、数据类型和内存拷贝问题。
  1. import numpy as np
  2. arr = np.array([1, 2, 3, 4, 5])
  3. squares = arr ** 2
  4. matrix = np.array([[1, 2, 3], [4, 5, 6]])
  5. result = matrix * np.array([10, 100, 1000])
  6. even_elements = arr[arr % 2 == 0]
  7. sum_total = np.sum(arr)
  8. view = arr[1:4]
复制代码

需要注意的是:向量化通常比显式循环更高效;广播规则不熟容易导致维度不匹配;大数组操作要关注内存;视图与副本行为不同;dtype 选择会影响内存和速度。

reStructuredText 风格
reStructuredText 是 Sphinx 等 Python 文档工具链常用的轻量标记语言。它适合编写项目文档、API 文档,并可转换为 HTML、LaTeX 等格式。使用时注意缩进一致、空行分隔结构、标题下划线长度不小于标题文本长度,特殊符号需要转义时用反斜杠。
  1. 主标题
  2. ======
  3. 二级标题
  4. --------
  5. * 项目符号列表
  6. * 第二个项目
  7. 1. 数字列表
  8. 2. 第二项
  9. 代码块::
  10.     def example():
  11.         print('使用4空格缩进')
  12. .. note::
  13.     这是一个提示框
  14. `超链接 <https://python.org>`_
复制代码

表格可以用 RST 表格语法;跨文档链接可用 :doc:`other_page` 或 :ref:`section-label`。

Epytext 风格
Epytext 是 Epydoc 工具默认支持的 docstring 标记格式,使用 @、L{} 等符号标注参数、返回值、异常等元素。标记符号应紧跟在行首或前导空格后,类型说明可选。它与 reStructuredText 的一个明显区别是使用 @ 而不是 : 作为标记前缀。
  1. def calculate_area(width, height):
  2.     '''
  3.     Calculate the area of a rectangle.
  4.     @param width: The width of the rectangle (in meters)
  5.     @type width: float
  6.     @param height: The height of the rectangle (in meters)
  7.     @type height: float
  8.     @return: The calculated area
  9.     @rtype: float
  10.     @raise ValueError: If either dimension is negative
  11.     '''
  12.     if width < 0 or height < 0:
  13.         raise ValueError('Dimensions cannot be negative')
  14.     return width * height
复制代码

总结
Python 注释规范的核心不是写得多,而是写得准。单行注释用 #,多行说明可用三引号但要知道它本质是字符串;函数、类、模块优先写 docstring,并能被 help()、__doc__、Sphinx 等工具读取。内容上要避免废话、过度注释和注释与代码不同步。风格上可遵循 PEP 257,并在 Google、NumPy、reStructuredText、Epytext 等常用格式中选择团队统一方案。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-9 12:20 , Processed in 0.032977 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部