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

本内容出自《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 宽度解析不一致,跨设备协作极易格式崩坏。
python 复制代码
# ✅ 正确:4空格缩进
def count_item(lst):
    result = 0
    for i in lst:
        result += i
    return result
  1. 单行代码最大长度79 字符;多行长表达式,续行在普通缩进基础上再多 4 个空格。

  2. 文件顶层,类与类、函数与函数之间保留两个空行 ;同一个 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. 字典书写:键和冒号之间不加空格,冒号与值之间加 1 个空格。
python 复制代码
# ✅
book = {"title": "Effective Python", "version": 2}
# ❌ 不推荐
book = {"title" : "Effective Python" , "version":2}
  1. 赋值符号=左右各一个空格,仅保留一个。

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

python 复制代码
# ✅
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
实例方法第一个形参 固定名字 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 之禅:每件事应该有简单的做法,最好只有一种。

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

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

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

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

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

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

📥 import 导入规范

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

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

python 复制代码
# ✅绝对导入
from mypkg.utils import helper

# ✅显式相对导入
from . import helper
  1. 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 不是死板教条,核心目标是提升代码可读性。绝大多数场景严格遵守;如果遵循规范反而让代码更加难懂,可以酌情例外。

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

相关推荐
郝学胜-神的一滴1 小时前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
sel_91 小时前
【多轮对话论文导读(二)】多轮对话与LLM Agent论文阅读:长期记忆、多轮评估与Agent训练
人工智能·深度学习·算法·语言模型·自然语言处理
RanMatrix2 小时前
Python列表精讲
python
一木 之林2 小时前
五、C++新特性、关键字与编译原理
java·jvm·算法
大模型丫丫2 小时前
FastAPI 入门指南:从零开始构建高性能 Python API
开发语言·python·fastapi
叫我:松哥2 小时前
基于flask图书数据管理系统,技术栈flask+MySQL+boostrap
python·mysql·flask
wangchen_02 小时前
PyTorch
人工智能·pytorch·python
卷无止境2 小时前
Python的contextlib与 FastAPI 中的上下文管理
后端·python·fastapi
测试19983 小时前
接口自动化测试的全面解析与实战指南
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试