在Python中,PEP是Python Enhancement Proposal的缩写,意为Python增强提案。PEP是一个设计文档,提供了关于Python的新功能的信息,或者提出了对Python社区中的某些问题的解决方案,或者描述了某些Python编程语言的特性和流程。PEP的目的是为Python社区提供一种统一的技术文档格式,以便讨论和记录Python语言的演变。

其中最著名的PEP是PEP 8,它提供了关于如何编写清晰、可读的Python代码的风格指南。PEP 8包括了关于代码布局、命名约定、编码风格、注释等方面的建议,旨在提高Python代码的一致性和可读性。遵循PEP 8的规范可以使得代码更容易被其他Python开发者阅读和理解。

以下是一些PEP 8的核心编码规范:

导入相关的规范

  • 导入应该写在文件顶部,位于模块注释和文档字符串之后,全局变量和常量之前。
  • 导入应该分组,标准库导入、相关第三方导入和本地应用/库特定导入应分别分组,并且每组之间用空行分隔。
  • 绝对导入通常被推荐,因为它们通常更可读并且更倾向于表现出更好的行为(或至少给出清晰的错误)。
# 错误的导入方式
import sys, os

# 正确的导入方式
import os
import sys

# 分组导入
import os
import sys

import requests

from mypackage import utils

空行规范

  • 顶层函数和类的定义之间应该用两个空行隔开。
  • 类的方法定义之间应该用一个空行隔开。
  • 在函数中使用空行来区分逻辑片段。
# 类定义之间应该有两个空行
class MyClass:
    pass


class AnotherClass:
    pass

# 方法定义之间应该有一个空行
class MyClass:
    def method_one(self):
        pass

    def method_two(self):
        pass

注释规范

  • 注释应该是更新的。过时的注释比没有注释更糟糕。
  • 避免无用的注释。
  • 内联注释应该至少使用两个空格与代码隔开。
  • 对于复杂的操作,应当在其上方或旁边使用注释。
# 错误:注释和代码没有空格分隔
#这是一个注释
print("Hello, World!")

# 正确:注释和代码之间有空格分隔
# 这是一个注释
print("Hello, World!")

字符串引号

  • 在Python中,单引号和双引号是相同的。PEP 8没有对此做出具体推荐,建议选择一种并保持一致性。
  • 对于包含单引号或双引号的字符串,建议使用另一种引号以避免在字符串中使用反斜杠。
# 使用单引号和双引号保持一致性
single_quoted = 'Hello, World!'
double_quoted = "Hello, World!"

# 使用另一种引号来避免转义
avoid_escape = "This string contains a single quote (') character."
avoid_escape = 'He said, "Hello, World!"'

空格的使用

  • 紧跟在左括号、左中括号、左大括号之后的逗号、分号或冒号之前不应该有空格。
  • 在右括号、右中括号、右大括号之前的逗号、分号或冒号之后应该有一个空格。
  • 在切片的冒号前后应该保持一致的空格(要么都有,要么都没有)。
  • 在赋值(=)和比较(==, !=, <, >, <=, >=, in, not in, is, is not)运算符周围应该有一个空格,但是在传递关键字参数或默认参数值时不应该使用空格。
  • 函数声明中,默认参数值两侧不应加空格。
# 错误:操作符周围没有空格
i=1
i=i+1

# 正确:操作符周围有空格
i = 1
i = i + 1

# 列表索引或切片操作中保持一致性
my_list = [1, 2, 3]
print(my_list[0])  # No space after [ or before ]
print(my_list[1:2])  # Keep consistent spacing

其他规范

  • 避免在一条import语句中导入多个库。
  • 使用is not而不是not ... is,尽管两者在功能上相同。
  • 当实现容器类型时(如列表或字典),清晰地定义__str____repr__
  • 类型注释的使用应当遵循PEP 484的规范,这有助于类型检查和更清晰的代码。
# 避免在一条import语句中导入多个库
# 错误的导入方式
from subprocess import Popen, PIPE

# 正确的导入方式
from subprocess import Popen
from subprocess import PIPE

# 使用is not代替not ... is
# 错误
if not x is None:
    pass

# 正确
if x is not None:
    pass

# 定义__str__和__repr__
class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"MyClass({self.value})"

    def __repr__(self):
        return f"MyClass({self.value!r})"
最后修改:2023 年 11 月 27 日
如果觉得我的文章对你有用,请随意赞赏