Effective Python 条款 2:遵循 PEP 8 编码风格,写出高质量 Python 代码

68 阅读4分钟

本内容出自《Effective Python 编写高质量 Python 代码的 90 个有效方法(第 2 版)》条款 2。 代码首先是写给人阅读的,其次才交给机器执行✨。语法合法不等于代码优秀,统一编码风格,是团队协作、后期维护的基础。

Python 官方编码规范文档 PEP 8,定义了一整套清晰编码的准则,文档会跟随 Python 语言迭代更新,完整原文:www.python.org/dev/peps/pe…。 条款 2 提炼了开发中必须恪守的核心规则,分为空白、命名、表达式语句、模块导入四大板块,下面结合原书要点 + 可运行示例做完整解读。

Bilibili 同步视频

Effective Python 条款 2:遵循 PEP 8 编码风格,写出高质量 Python 代码

📐 空白(Whitespace):Python 排版的重中之重

Python 的缩进具备语法效力,空白不是无意义字符,乱使用空格、Tab 会直接造成排版错乱,甚至隐性 bug。

  1. 缩进只用 4 个空格,禁止 Tab 制表符。不同编辑器对 Tab 宽度解析不一致,跨设备协作极易格式崩坏。
# ✅ 正确:4空格缩进
def count_item(lst):
    result = 0
    for i in lst:
        result += i
    return result
  1. 单行代码最大长度79 字符;多行长表达式,续行在普通缩进基础上再多 4 个空格。

  2. 文件顶层,类与类、函数与函数之间保留两个空行;同一个 class 内部,各个方法之间保留一个空行

class Book:
    def __init__(self, name):
        self.name = name

    def get_name(self):
        return self.name


def print_book(book):
    print(book.name)
  1. 字典书写:键和冒号之间不加空格,冒号与值之间加 1 个空格。
# ✅
book = {"title": "Effective Python", "version": 2}
# ❌ 不推荐
book = {"title" : "Effective Python" , "version":2}
  1. 赋值符号=左右各一个空格,仅保留一个。

  2. 变量类型注解:变量名紧贴冒号,冒号后面加空格再写类型。

# ✅
def show(num: int) -> None:
    print(num)
# ❌
def show(num :int) -> None:
    print(num)

🏷️ 命名规范:看标识符就能读懂语义

PEP8 对不同对象规定专属命名范式,看到名字就能分辨是变量、类、保护属性、私有属性还是常量。

对象命名规则示例
普通变量、函数、实例属性小写 + 下划线user_listcalc_price
受保护实例属性单下划线_开头_cache_data
私有实例属性双下划线__开头__password_hash
类、自定义异常大驼峰,每个单词首字母大写OrderQueryParamsInvalidError
模块全局常量全部大写,下划线分隔MAX_RETRY_TIMES
实例方法第一个形参固定名字 selfdef func(self):
类方法第一个形参固定名字 cls@classmethod def func(cls):

示例代码:

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 之禅:每件事应该有简单的做法,最好只有一种。

  1. 否定判断优先行内否定 is not,不要写 not a is b
val = None
# ✅
if val is not None:
    pass

# ❌ 可读性差,避免使用
if not val is None:
    pass
  1. 判断容器空 / 非空,不要用len(x) == 0。Python 中空序列、空容器会自动被视作False
data = []
# ✅ 判断为空
if not data:
    print("没有数据")

# ✅ 判断不为空
if data:
    print("存在数据")

# ❌ C/Java思维,冗余
if len(data) == 0:
    print("没有数据")
  1. ifforwhileexcept不要压缩写在同一行,拆分多行提升可读性。
# ✅
for item in [1,2,3]:
    print(item)

# ❌ 不推荐
for item in [1,2,3]: print(item)
  1. 长表达式换行,优先用括号包裹,尽量不用反斜杠**``**续行。反斜杠末尾看不见的空格,会直接引发语法错误。
# ✅ 括号换行
sum_total = (
    base_money
    + bonus
    - deduct
)

# ❌ 反斜杠续行,易出错
sum_total = base_money 
    + bonus 
    - deduct

📥 import 导入规范

  1. import / from ... import ... 全部放置在文件最开头

  2. 优先绝对导入;非要使用相对导入,必须显式写.

# ✅绝对导入
from mypkg.utils import helper

# ✅显式相对导入
from . import helper
  1. import 分成三组,组和组之间空一行,每组内部按字母排序: ① 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 不是死板教条,核心目标是提升代码可读性。绝大多数场景严格遵守;如果遵循规范反而让代码更加难懂,可以酌情例外。

Effective Python 条款 2:遵循 PEP 8 编码风格,写出高质量 Python 代码

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