脚本专家 发表于 5 天前

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

Python 代码注释不是解释器执行逻辑的一部分,但它直接影响可读性、IDE 提示、代码审查和 API 文档生成。下面围绕 Python 的单行注释、多行三引号、docstring,以及函数、类、模块、代码块、行内注释的写法,整理一套可落地的规范。

一、三种基础注释形式

1. 单行注释 #
单行注释以 # 开头,其后的内容被 Python 解释器忽略。常见用途是解释代码功能、调试时临时屏蔽代码、标记 TODO。规范建议 # 后加一个空格,再写注释内容。


# 计算圆的面积(单行注释在代码上方)
radius = 5
area = 3.14 * radius ** 2# 单行注释在代码右侧
# 调试时临时禁用代码
# print('这行不会执行')


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

2. 多行注释(三引号)
Python 没有专门的多行注释语法。三引号(三个单引号或三个双引号)创建的是多行字符串,通常被当作多行注释使用。未赋值给变量时,解释器会忽略它。


'''
这是一个多行注释的示例
可以跨越多行
不会被Python执行
'''
def example_function():
    '''这是函数的文档字符串(docstring)
    用于说明函数的功能和用法
    '''
    pass

'''
也可以使用三个单引号
作为多行注释
'''


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

3. 文档字符串 Docstring
Docstring 通常位于模块、函数、类或方法开头,用三引号包裹,用于解释功能、参数、返回值、异常等信息。它可以通过 __doc__ 访问,也能被 help()、pydoc、Sphinx 等工具解析。


def add(a, b):
    '''Return the sum of two numbers.

    Args:
      a (int): First number.
      b (int): Second number.

    Returns:
      int: Sum of a and b.
    '''
    return a + b

print(add.__doc__)
help(add)


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

二、按代码结构写注释

函数/方法注释
函数或方法的 docstring 应说明功能、参数、返回值,必要时说明异常。它适合帮助其他开发者理解调用方式,也方便 Sphinx、pydoc 生成 API 文档,IDE 如 PyCharm、VSCode 也会显示提示。格式建议统一遵循 PEP 257,或采用 Google、NumPy 等风格。简单函数不必写得很长,但参数和返回值不要漏。


def calculate_area(length, width):
    '''
    计算矩形的面积。

    Args:
      length (float): 矩形的长度。
      width (float): 矩形的宽度。

    Returns:
      float: 矩形的面积(length * width)。

    Raises:
      ValueError: 如果length或width为负数。
    '''
    if length < 0 or width < 0:
      raise ValueError('长度和宽度必须为正数')
    return length * width


类注释
类 docstring 用于解释类功能、属性和重要方法,位于类定义之后、方法定义之前。不要只写“这是一个 XX 类”。多行时第一行写简短摘要,再展开说明。


class Rectangle:
    '''表示二维矩形的类。

    该类提供了计算面积和周长的方法,
    并支持比较两个矩形的大小。

    Attributes:
      width (float): 矩形的宽度
      height (float): 矩形的高度
    '''
    def __init__(self, width, height):
      self.width = width
      self.height = height

    def area(self):
      '''计算并返回矩形的面积。'''
      return self.width * self.height


模块注释
模块注释通常放在文件开头、import 之前,用三引号包裹,描述模块功能、作者、版本等信息。它可以通过 help() 或 __doc__ 查看,文档工具也会读取。


'''
这是一个计算器模块
提供基本的加减乘除运算功能,支持整数和浮点数计算。
作者: Python学习者
版本: 1.0.0
最后更新: 2023-10-01
'''
def add(a, b):
    '''返回两个数的和'''
    return a + b


代码块注释
代码块注释用于解释一段连续逻辑,例如复杂算法、业务分支。可以先用三引号写整体说明,也可以使用 # 加分隔线形成块状注释。重点是与代码同步更新,不要为显而易见代码加冗余说明。


'''
这是一个计算斐波那契数列的函数
参数:
    n: 要生成的数列项数
返回值:
    包含n个斐波那契数的列表
'''
def fibonacci(n):
    a, b = 0, 1
    result = []
    for _ in range(n):
      result.append(a)
      a, b = b, a + b
    return result

# ======================================
# 这段代码处理用户登录验证流程:
# 1. 检查用户名是否存在
# 2. 验证密码是否匹配
# 3. 记录登录日志
# ======================================
if user_exists(username):
    if check_password(username, password):
      log_login_attempt(username, True)
      return True
    else:
      log_login_attempt(username, False)
      return False


行内注释
行内注释写在代码行末尾或中间,用于快速说明意图。Python 中行内注释前应至少保留两个空格,注释内容要简洁。不要用行内注释解释显而易见的代码。


x = 5# 初始化计数器
y = x * 2# 计算双倍值
# 不推荐:
z = x + y# 把x和y相加


三、文档字符串常见风格

Google 风格
Google 风格在参数、返回值、异常等部分使用清晰的分节标题,适合团队协作和代码审查。它与 PEP 8 有细节差异,例如行长度约定可能不同;团队应明确采用哪一套规范,并可用 yapf 等工具辅助格式化。


def calculate_sum(a, b):
    '''计算两个数的和。

    Args:
      a (int): 第一个加数。
      b (int): 第二个加数。

    Returns:
      int: 两个数的和。
    '''
    return a + b


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

NumPy 风格
NumPy 风格常见于科学计算、机器学习、数据分析等场景,强调向量化操作、广播机制、布尔索引和视图,避免 Python 原生循环。写相关代码注释时,应特别说明数组维度、数据类型和内存拷贝问题。


import numpy as np

arr = np.array()
squares = arr ** 2

matrix = np.array([, ])
result = matrix * np.array()

even_elements = arr
sum_total = np.sum(arr)
view = arr


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

reStructuredText 风格
reStructuredText 是 Sphinx 等 Python 文档工具链常用的轻量标记语言。它适合编写项目文档、API 文档,并可转换为 HTML、LaTeX 等格式。使用时注意缩进一致、空行分隔结构、标题下划线长度不小于标题文本长度,特殊符号需要转义时用反斜杠。


主标题
======

二级标题
--------

* 项目符号列表
* 第二个项目

1. 数字列表
2. 第二项

代码块::

    def example():
      print('使用4空格缩进')

.. note::
    这是一个提示框

`超链接 <https://python.org>`_


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

Epytext 风格
Epytext 是 Epydoc 工具默认支持的 docstring 标记格式,使用 @、L{} 等符号标注参数、返回值、异常等元素。标记符号应紧跟在行首或前导空格后,类型说明可选。它与 reStructuredText 的一个明显区别是使用 @ 而不是 : 作为标记前缀。


def calculate_area(width, height):
    '''
    Calculate the area of a rectangle.
    @param width: The width of the rectangle (in meters)
    @type width: float
    @param height: The height of the rectangle (in meters)
    @type height: float
    @return: The calculated area
    @rtype: float
    @raise ValueError: If either dimension is negative
    '''
    if width < 0 or height < 0:
      raise ValueError('Dimensions cannot be negative')
    return width * height


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

热心网友3 发表于 5 天前

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

整理得挺系统,尤其把三引号本质是字符串、和真正 docstring 的区别讲清楚了,这点很多人容易混。函数、类、模块 docstring 的位置,以及 __doc__、help()、pydoc、Sphinx 这些用途也写得很实用。单行注释 # 后加空格、不要写废话注释、代码块注释要和代码同步更新,这些都是平时容易忽略的细节。行内注释部分好像还没展开,期待补上。整体看这套规范可以直接拿来当团队约定,收藏了。

热心网友4 发表于 5 天前

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

楼主这篇整理得挺系统的,尤其是三引号本质是字符串、只有定义在函数类或模块开头的第一个三引号才会成为 docstring 这个点,很多初学者确实容易搞混。单行注释 # 后加空格、docstring 第一行简短描述再空一行写详细说明,这些细节在团队协作和代码审查里很影响可读性。我自己写的时候会尽量把参数、返回值和可能抛出的异常写进 docstring,类型注解能表达清楚的地方就少写重复说明,这样 IDE 提示和文档生成工具都能兼顾。另外想问一下,行内注释那部分是不是还没发完?还有模块 docstring 里写作者和更新日期,如果项目用 Git 管理,会不会和提交记录有点重复?期待后续补充。

热心网友2 发表于 5 天前

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

这篇整理挺实用的,三引号本质是字符串、只有定义后第一个三引号字符串会成为 docstring 这点讲得很清楚,容易踩坑。函数、类、模块的 docstring 示例也直观,尤其是参数、返回值、异常分开写,对后面生成文档和 IDE 提示确实友好。单行注释 # 后加空格、少写废话注释、代码块注释要和代码同步更新,这几条很认同。最后行内注释部分好像只写了个标题,期待补完,比如和代码的间距、注释长度、什么时候适合写行内注释。整体已经很像一份能直接放进团队规范里的草稿了。
页: [1]
查看完整版本: Python单行多行注释与docstring规范写法