编码规范 PEP 8
PEP 8 是 Python 官方的风格指南,由 Guido van Rossum 等人编写。它并非语法规则(违反不会报错),而是社区共识——遵循 PEP 8 的代码更容易被其他 Python 程序员阅读和维护。Python 之禅说:"可读性很重要(Readability counts)",PEP 8 就是这句话的具体实践。
缩进:4 个空格
Python 用缩进来表示代码块,而非大括号。PEP 8 规定使用 4 个空格 作为一级缩进,禁止使用 Tab 字符。
# 正确
if x > 0:
print "positive"
if x > 10:
print "greater than 10"
# 错误:Tab 与空格混用
if x > 0:
print "positive" # 这是 Tab,不要这样做
混用 Tab 和空格是 Python 2 中最隐蔽的 bug 来源之一。解释器会抛出 IndentationError,但错误提示的位置往往让人困惑。大多数编辑器可以设置"将 Tab 自动转换为空格",建议开启这个功能。
行长度:79 字符
PEP 8 建议每行不超过 79 字符,文档字符串不超过 72 字符。这个限制源于早期终端的物理宽度,但沿用至今是因为它强迫程序员写出更简洁的表达式,避免嵌套过深。
如果一行太长,可以用圆括号隐式换行:
# 推荐:用圆括号包裹
result = (some_long_variable_name + another_long_name
+ yet_another_name)
# 也可以用反斜杠(不推荐,容易遗漏)
result = some_long_variable_name + another_long_name \
+ yet_another_name
命名规范
Python 社区对不同类型的标识符有约定俗成的命名方式:
# 模块/包/函数/变量:snake_case
import my_module
def calculate_average(scores):
total_score = sum(scores)
return total_score / len(scores)
# 类名:PascalCase(大驼峰)
class StudentRecord(object):
pass
# 常量:UPPER_SNAKE_CASE
MAX_CONNECTIONS = 100
PI = 3.14159
# 私有成员:前导单下划线(约定,非强制)
class BankAccount(object):
def __init__(self):
self._balance = 0 # "内部使用,不要直接访问"
# 强私有/魔术方法:双下划线
class MyClass(object):
def __init__(self): # 构造方法
pass
def __str__(self): # 字符串表示
return "MyClass"
单下划线前缀 _name 是一种"温和"的隐私提示:它告诉其他程序员"这个属性是内部实现,外部不应直接访问",但技术上仍然可以访问。双下划线前缀 __name 会触发名称改写(name mangling),将 __name 变成 _ClassName__name,从而避免子类意外覆盖。
注释与文档字符串
行注释用 #,与代码之间至少隔两个空格:
x = x + 1 # 补偿边界
文档字符串(docstring) 用三引号,放在模块、函数、类的开头:
def calculate_average(scores):
"""计算分数列表的平均值。
参数:
scores: 包含数字的列表。
返回:
平均值,浮点数。如果列表为空返回 0.0。
"""
if not scores:
return 0.0
return sum(scores) / float(len(scores))
文档字符串不是普通的注释,它可以通过 calculate_average.__doc__ 在运行时访问,也是 help() 函数的显示内容。
导入风格
导入语句应该分组排列,组之间空一行:
# 1. 标准库导入
import os
import sys
from math import sqrt
# 2. 第三方库导入
import requests
from django import db
# 3. 本地应用/模块导入
from mypackage import utils
from mypackage.models import User
避免 from module import *,因为它会导入模块中所有公开名称,可能覆盖你已有的变量,也让读者无法判断某个名字来自哪里。
# 不推荐
from os import *
print path.exists("file.txt") # path 是从 os 导入的,不明显
# 推荐
import os
print os.path.exists("file.txt")
空行与空格
函数之间用两个空行分隔,类的方法之间用一个空行分隔:
def func_one():
pass
def func_two():
pass
class MyClass(object):
def method_one(self):
pass
def method_two(self):
pass
赋值和比较运算符两侧加空格,但函数调用和索引的括号内侧不加:
# 正确
x = 1
y = x + 2
if x == y:
print func(x, y)
print arr[0]
# 错误
x=1
y = x+2
if x==y:
print func ( x , y )
print arr[ 0 ]
一致性优先
PEP 8 的最后一条原则是:"当你无法判断时,保持一致。"如果你正在维护一个项目,而项目本身的风格与 PEP 8 有冲突(比如使用 2 个空格缩进),那么优先遵循项目现有风格,而不是强行套用 PEP 8。风格一致比风格正确更重要。