注释是写给人看的
Python 会忽略注释,这就是全部的诀窍。你标记为注释的任何内容,解释器都看不见。它纯粹是写给读代码的人看的,而这个人通常就是六个月后的你,正纳闷当初的自己在想什么。
话虽如此,只是复述代码明显在做什么的注释,不值得写。最好的注释解释的是为什么:某个限制、某个变通办法、某个无法从代码本身看出来的决定。代码本身已经告诉你它在做什么了。
用 # 写单行注释
基本形式是一个 #,后面跟着你的说明:
你也可以在一行代码的末尾加一条简短的注释。按照惯例,# 前面至少留两个空格:
Python 会把字符串之外任意位置的 # 之后的内容当作注释。“字符串之外”这一点很重要:引号里的 # 只是一个普通字符。
字符串里的 #section-2 是 URL 的一部分。只有字符串结束之后的那个 #,才会让 Python 进入“注释”模式。
注释多行代码
Python 没有 /* */ 这样的块注释。要跳过多行,就在每一行开头加上 #:
这些 # 你几乎从来不需要手动输入。每个像样的编辑器都有“切换行注释”的快捷键,可以给所有选中的行加上或去掉 #:
- VS Code:Cmd + /(macOS)或 Ctrl + /(Windows/Linux)
- PyCharm:Cmd + / 或 Ctrl + /
- Vim:取决于你的插件;
vim-commentary用gcc注释单行,用gc注释选中的内容。
在你的编辑器里把快捷键学会一次,“先把这段注释掉试试别的”就变成了一键操作。
三引号字符串技巧(以及为什么它不是真正的注释)
你有时会看到这样的代码:
严格来说,这是一个会被丢弃的字符串表达式。Python 会解析它、求值,然后把结果扔掉。它表现得像注释,但并不是注释。从代码风格来看,只有在一个特定的地方这样写才合适:作为文档字符串。
文档字符串:三引号唯一该出现的地方
文档字符串(docstring)是放在函数、类或模块中第一条语句位置的三引号字符串。Python 会把它识别为文档,并在运行时通过 help() 函数和 __doc__ 属性提供出来:
文档字符串有两个好处:
- IDE、
help()和文档生成器等工具会自动读取它们。写在函数上方的注释可没有这种待遇。 - 它们在调用处说明函数的用途:当有人在编辑器里把鼠标悬停在
discount(...)上时,文档字符串会作为提示弹出来。
关于文档字符串里写什么,有一个约定(PEP 257):第一行是一句话的概述,然后空一行,如果需要再写更详细的说明。刚开始不用太纠结具体格式,简单的一行说明也比完全没有文档字符串好得多。
好的注释应该写什么
几条能为你省去很多麻烦的建议:
- 多写为什么,少写是什么。
# Loop over the users是废话;# Retry on 503 - Redis sometimes dies mid-deploy才有价值。 - 修改代码时同步更新注释。错误的注释比没有注释更糟。过时的注释会误导以后读代码的人。
- 不要把注释掉的代码留在那里。不需要的代码就删掉,版本控制会帮你记着。到处是被注释掉的代码块的文件,很快就会让人不敢相信。
- 跳过显而易见的内容。
x = x + 1 # increment x没有任何价值。
总结
注释写起来不花什么功夫,不写也没什么损失。当你要留下一条读者会感谢你的说明时,就写注释:某段代码能正常工作的微妙原因、一个 issue 的链接、对某个边界情况的提醒。定义函数或类时,使用文档字符串。其他时候,就让清晰的命名和短小的函数来说话。
现在你已经掌握了阅读和编写 Python 文件所需的一切。下一章,这门语言才真正开始做事:变量、数据类型,以及 Python 能存放的各种值。
常见问题
Python 中如何写注释?
在一行的开头(或行中任意位置)加上 #,这一行 # 之后的所有内容都是注释。Python 运行代码时会完全忽略注释。
Python 中如何注释多行代码?
Python 没有专门的多行注释语法。在每一行想跳过的代码开头加上 # 即可。大多数编辑器都有快捷键,可以一次性给所有选中的行加上或去掉 #,比如 VS Code 中的 Cmd/Ctrl + /。
Python 中的三引号字符串是注释吗?
不完全是。没有赋值给任何变量的三引号字符串在运行时表现得像注释,但 Python 仍然会把它当作字符串来解析。这种写法主要用于文档字符串(docstring),也就是函数、类和模块的说明文档,而不是普通的注释。