Python 中的 PEP 8 | PEP 8 在 Python 中有什么作用?

2025年3月17日 | 阅读 10 分钟

在本教程中,我们将学习 PEP-8 是什么以及如何在 Python 编码中使用它。我们将讨论在编程中使用 PEP 的指南——本教程面向初学者到中级水平。我们还将讨论在编码时使用 PEP-8 的好处。

什么是 PEP?

PEP 是 Python Enterprise Proposal 的缩写。编写具有适当逻辑的代码是编程的关键因素,但还有许多其他重要因素会影响代码的质量。开发者的编码风格使代码更加可靠,每个开发者都应该记住,Python 严格遵循字符串的顺序和格式。

采用良好的编码风格可以使代码更具可读性。代码对最终用户来说更容易理解。

PEP 8 是一个文档,提供了编写 Python 可读代码的各种指南。PEP 8 描述了开发者如何编写优雅的代码。它由 Guido van Rossum、Barry Warsaw 和 Nick Coghlan 于 2001 年正式撰写。PEP 的主要目标是提高代码的可读性和一致性。

为什么 PEP 8 很重要?

PEP 8 提高了 Python 代码的可读性,但可读性为什么如此重要?让我们来理解这个概念。

Python 的创造者 Guido van Rossum 说:“代码被阅读的次数比被编写的次数多得多。”代码可能在几分钟、几小时或一整天内写完,但一旦我们写完代码,我们就再也不会重写它了。但有时,我们需要一遍又一遍地阅读代码。

在这一点上,我们必须了解为什么我们要写代码中的特定行。代码应该反映每一行的含义。这就是为什么可读性如此重要的原因。

我们将描述一些编写有效代码的重要指南,这些代码也可以被他人阅读。

命名约定

当我们编写代码时,我们需要为许多事物分配名称,例如变量、函数、类、包等等。选择一个合适的名称将节省时间和精力。当过一段时间后我们再次查看文件时,我们可以轻松回忆起某个变量、函数或类代表什么。开发者应避免选择不恰当的名称。

Python 中的命名约定有点混乱,但有一些约定我们可以轻松遵循。让我们看看以下命名约定。

示例 -

单个小写字母

单个大写字母

小写

小写_带下划线

大写

大写_带下划线

首字母大写单词(或驼峰命名法)

注意:在使用缩写词时,CapWords 风格应将缩写词的所有字母都大写。因此 HTTPServerError 比 HttpServerError 更好。

名称样式

下表指定了 Python 中一些常见的命名样式。请考虑下表。

类型命名约定示例
函数我们应该使用小写单词或用下划线分隔单词。myfunction, my_function
变量我们应该使用小写字母、单词或分隔单词来提高可读性。a, var, variable_name
Class类名的首字母应大写;使用驼峰命名法。不要用下划线分隔单词。MyClass, Form, Model
方法我们应该使用小写字母、单词或分隔单词来提高可读性。class_method, method
Constant我们应该使用简短的大写字母、单词或分隔单词来提高可读性。MYCONSTANT, CONSTANT, MY_CONSTANT
模块我们应该使用小写字母、单词或分隔单词来提高可读性。Module_name.py, module.py
我们应该使用小写字母、单词或分隔单词来提高可读性。不要用下划线分隔单词。package, mypackage,

以上是一些有助于美化 Python 代码的常见命名约定。为了进一步改进,我们应该仔细选择名称。

代码布局

代码布局决定了代码的可读性。在本节中,我们将学习如何使用空格来提高代码的可读性。

缩进

与其他编程语言不同,Python 使用缩进来定义代码块。缩进是 Python 编程语言的重要组成部分,它决定了代码行的级别。通常,我们使用 4 个空格进行缩进。让我们通过以下示例来理解。

示例 -

在上面的示例中,如果 if 语句 的条件为真,则缩进的 print 语句将执行。此缩进定义了代码块,并告诉我们当函数被调用或条件触发时哪些语句会被执行。

  • 制表符 vs. 空格

我们也可以使用 制表符 来提供连续的空格以表示缩进,但空格是最优选的。Python 2 允许混合使用制表符和空格,但在 Python 3 中会报错。

换行后的缩进

当使用换行符时,使用缩进至关重要,以便将行保持在 79 个字符以内。这提供了区分两行代码和一条延伸两行的代码的灵活性。让我们通过以下示例来理解。

示例 -

我们可以使用以下结构。

使用文档字符串

Python 提供了两种类型的文档字符串(docstring)——单行和多行。我们使用三引号来定义单行或多行文档字符串。基本上,它们用于描述函数或特定程序。让我们通过以下示例来理解。

示例 -

二元运算符之前或之后是否应换行?

在二元运算之前或之后换行是一种传统方法。但这会极大地影响可读性,因为运算符分散在不同的屏幕上,每个运算符都远离其操作数并移到上一行。让我们通过以下示例来理解。

示例 -

如上例所示,阅读起来相当混乱。我们可以使用以下结构来解决此类问题。

示例 -

Python 允许我们在二元运算符之前或之后换行,只要局部保持一致即可。

导入模块

我们应该将模块导入到单独的行中,如下所示。

错误

我们也可以使用以下方法。

导入语句应写在文件顶部,或者紧跟在任何模块注释之后。绝对导入是推荐的,因为它们更具可读性并且通常表现更好。

然而,我们可以使用显式的相对导入而不是绝对导入,特别是在处理复杂的包时。

空行

空行可以提高 Python 代码的可读性。如果太多行代码挤在一起,代码将变得难以阅读。我们可以通过使用许多空白的垂直行来消除这种情况,读者可能需要滚动更多。请遵循以下说明来添加垂直空格。

  • 顶级函数和类之间有两个空行 - 在它们周围放置额外的垂直空间,以便能够理解。
  • 类内部有一个空行 - 我们在类中定义的函数彼此相关。让我们看下面的例子 -
  • 在函数内部使用空行 - 有时,我们需要编写一个包含几个步骤才能返回的复杂函数。所以我们可以在每个步骤之间添加一个空行。让我们通过以下示例来理解。

上述方法可以去除空格以提高代码的可读性。

放置闭合括号

我们可以使用换行符在括号、方括号内换行。PEP 8 允许我们在隐含换行时使用闭合括号。让我们通过以下示例来理解。

  • 将闭合括号与第一个非空格字符对齐。
  • 将闭合括号与行中的第一个字符对齐。

这两种方法都适用,但一致性是关键,所以选择一种并继续使用。

注释

注释是任何编程语言的组成部分。它们是解释代码的最佳方式。当我们用适当的注释记录代码时,任何人都能理解代码。但我们应该记住以下几点。

  • 以大写字母开头,写完整的句子。
  • 在代码更改时更新注释。
  • 将注释和文档字符串的行长限制为 72 个字符。

块注释

块注释是处理一小段代码的好选择。当我们将多行代码编写为一个操作(例如循环迭代)时,这些注释很有用。它们帮助我们理解代码的目的。

PEP 8 提供了以下编写注释块的规则。

  • 块注释应与代码缩进在同一级别。
  • 每行以 # 开头,后跟一个空格。
  • 使用单个 # 分隔行。

让我们看以下代码。

我们可以为技术代码使用多个段落。让我们通过以下示例来理解。

行内注释

行内注释用于解释代码中的单个语句。我们可以快速了解为什么写了那一行特定的代码。PEP 8 规定了行内注释的以下规则。

  • 以 # 和一个空格开头。
  • 谨慎使用行内注释。
  • 我们应该将行内注释与它们所指的语句放在同一行的后面。

以下是行内注释的示例。

有时,我们可以使用命名约定来替换行内注释。

我们可以使用以下命名约定。

行内注释很重要,但块注释可以使代码更具可读性。

避免不必要地添加空格

在某些情况下,使用空格会使代码更难阅读。过多的空格会使代码过于稀疏且难以理解。我们应该避免在行尾添加空格。这被称为尾随空格。

让我们看下面的例子。

示例 - 1

示例 - 3

编程建议

众所周知,Python 中有几种执行类似任务的方法。在本节中,我们将看到 PEP 8 的一些建议来提高一致性。

避免使用等价运算符比较布尔值

我们不应该使用等价运算符 == 来比较布尔值。它只能取 True 或 False。让我们看下面的例子。

这种方法很简单,因此 PEP 8 鼓励它。

空序列在 if 语句中被视为 False

如果我们想检查一个给定的列表是否为空,我们可能需要检查列表的长度,所以我们需要避免以下方法。

但是,如果存在任何空列表、集合或元组。我们可以使用以下方法进行检查。

第二种方法更合适;因此 PEP 8 鼓励它。

在 if 语句中不要使用 not is

有两种选择可以检查一个变量是否具有定义值。第一种选择是使用 x is not None,如下例所示。

第二种选择是评估 x is None,并在 if 语句中基于其结果取反。

这两种选择都是正确的,但第一种更简单,因此 PEP 8 鼓励它。

结论

我们已经讨论了 PEP 8 的指南,以消除代码的歧义并提高可读性。这些指南可以改进代码,尤其是在与潜在员工或协作者共享代码时。我们已经讨论了 PEP 是什么以及它为什么被使用,如何编写符合 PEP 8 的代码。此外,我们还简要介绍了命名约定。如果您想了解有关 PEP 8 的更多信息,可以阅读完整文档或访问 PEP8.org


下一个主题Python 用户组