在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})"