本内容出自《Effective Python 编写高质量 Python 代码的 90 个有效方法(第 2 版)》条款 2。 代码首先是写给人阅读的,其次才交给机器执行✨。语法合法不等于代码优秀,统一编码风格,是团队协作、后期维护的基础。
Python 官方编码规范文档 PEP 8 ,定义了一整套清晰编码的准则,文档会跟随 Python 语言迭代更新,完整原文:www.python.org/dev/peps/pe...。 条款 2 提炼了开发中必须恪守的核心规则,分为空白、命名、表达式语句、模块导入四大板块,下面结合原书要点 + 可运行示例做完整解读。
Bilibili 同步视频
📐 空白(Whitespace):Python 排版的重中之重
Python 的缩进具备语法效力,空白不是无意义字符,乱使用空格、Tab 会直接造成排版错乱,甚至隐性 bug。
- 缩进只用 4 个空格,禁止 Tab 制表符。不同编辑器对 Tab 宽度解析不一致,跨设备协作极易格式崩坏。
python
# ✅ 正确:4空格缩进
def count_item(lst):
result = 0
for i in lst:
result += i
return result
-
单行代码最大长度79 字符;多行长表达式,续行在普通缩进基础上再多 4 个空格。
-
文件顶层,类与类、函数与函数之间保留两个空行 ;同一个 class 内部,各个方法之间保留一个空行。
python
class Book:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def print_book(book):
print(book.name)
- 字典书写:键和冒号之间不加空格,冒号与值之间加 1 个空格。
python
# ✅
book = {"title": "Effective Python", "version": 2}
# ❌ 不推荐
book = {"title" : "Effective Python" , "version":2}
-
赋值符号
=左右各一个空格,仅保留一个。 -
变量类型注解:变量名紧贴冒号,冒号后面加空格再写类型。
python
# ✅
def show(num: int) -> None:
print(num)
# ❌
def show(num :int) -> None:
print(num)
🏷️ 命名规范:看标识符就能读懂语义
PEP8 对不同对象规定专属命名范式,看到名字就能分辨是变量、类、保护属性、私有属性还是常量。
| 对象 | 命名规则 | 示例 |
|---|---|---|
| 普通变量、函数、实例属性 | 小写 + 下划线 | user_list、calc_price |
| 受保护实例属性 | 单下划线_开头 |
_cache_data |
| 私有实例属性 | 双下划线__开头 |
__password_hash |
| 类、自定义异常 | 大驼峰,每个单词首字母大写 | OrderQuery、ParamsInvalidError |
| 模块全局常量 | 全部大写,下划线分隔 | MAX_RETRY_TIMES |
| 实例方法第一个形参 | 固定名字 self |
def func(self): |
| 类方法第一个形参 | 固定名字 cls |
@classmethod def func(cls): |
示例代码:
python
MAX_CONNECT = 10 # 模块常量
class OrderService:
def __init__(self):
self._tmp_buffer = dict() # 受保护属性
self.__inner_id = "" # 私有属性
def get_inner(self):
return self.__inner_id
@classmethod
def new_service(cls):
return cls()
🧩 表达式与语句:践行 Python 之禅,写 Pythonic 代码
Python 之禅:每件事应该有简单的做法,最好只有一种。
- 否定判断优先行内否定
is not,不要写not a is b
python
val = None
# ✅
if val is not None:
pass
# ❌ 可读性差,避免使用
if not val is None:
pass
- 判断容器空 / 非空,不要用
len(x) == 0。Python 中空序列、空容器会自动被视作False。
python
data = []
# ✅ 判断为空
if not data:
print("没有数据")
# ✅ 判断不为空
if data:
print("存在数据")
# ❌ C/Java思维,冗余
if len(data) == 0:
print("没有数据")
if、for、while、except不要压缩写在同一行,拆分多行提升可读性。
python
# ✅
for item in [1,2,3]:
print(item)
# ❌ 不推荐
for item in [1,2,3]: print(item)
- 长表达式换行,优先用括号包裹,尽量不用反斜杠 **``**续行。反斜杠末尾看不见的空格,会直接引发语法错误。
python
# ✅ 括号换行
sum_total = (
base_money
+ bonus
- deduct
)
# ❌ 反斜杠续行,易出错
sum_total = base_money
+ bonus
- deduct
📥 import 导入规范
-
import/from ... import ...全部放置在文件最开头。 -
优先绝对导入 ;非要使用相对导入,必须显式写
.。
python
# ✅绝对导入
from mypkg.utils import helper
# ✅显式相对导入
from . import helper
- import 分成三组,组和组之间空一行,每组内部按字母排序: ① Python 标准库 → ②第三方库 → ③项目自身模块
python
# 标准库
import json
import time
# 第三方库
import requests
# 项目自有代码
from mypkg.utils import helper
🛠️ 工具:Pylint 静态检查工具
人总会疏忽细节,可以借助工具自动校验 PEP8 规范,还可以提前捕获很多代码错误。
Pylint 官网:www.pylint.org/
PyCharm、VS Code 主流编辑器都支持集成 Lint 工具,编码过程实时提示不规范的地方,不用死记全部 PEP8 条款。
✨条款小结(Effective Python 条款 2 核心思想)
PEP8 不是死板教条,核心目标是提升代码可读性。绝大多数场景严格遵守;如果遵循规范反而让代码更加难懂,可以酌情例外。

统一编码风格,无论是个人维护旧代码,还是团队协同开发,都能大幅降低理解成本。