Python进阶-day20: 代码风格与工具
目标
- 深入理解 PEP 8 规范及其对代码整洁性的影响。
- 使用 PyCharm 内置工具进行代码检查、格式化和重构。
- 通过重构示例,展示如何提升代码的 整洁性(结构清晰)、可读性(易于理解)、复用性(模块化设计)。
- 练习:重构一个复杂项目,优化代码质量并验证效果。
术语解释
- PEP 8: Python 的官方代码风格指南,涵盖命名、缩进、空格、注释等。 目标:统一代码风格,增强团队协作效率。 关键规则: 缩进:4 个空格。 行长度:建议 79 字符(现代项目常用 88 或 120)。 命名:函数和变量用 snake_case,类用 CamelCase。 注释:清晰、简洁,避免冗余。
- PyCharm: JetBrains 开发的 Python IDE,提供强大的代码检查、格式化和重构工具。 内置支持 PEP 8 检查、自动格式化、代码重构(如重命名、提取方法)和静态分析。
- 代码重构: 在不改变代码功能的前提下,改进其结构、命名或设计。 目标: 整洁性:消除代码异味(如长函数、重复代码),使结构更简洁。 可读性:通过清晰的命名、注释和格式,让代码易于理解。 复用性:通过模块化设计和抽象,提升代码的通用性和可维护性。
- 代码异味(Code Smell): 代码中可能导致维护困难的潜在问题,如长函数、重复代码、复杂条件语句等。 重构的目标是消除这些异味。
使用 PyCharm 进行代码格式化与检查
1. 配置 PyCharm 的 PEP 8 检查
PyCharm 内置了 PEP 8 检查工具,可以实时提示风格问题。
步骤:
- 打开 PyCharm 设置: Windows/Linux:File > Settings > Editor > Code Style > Python macOS:PyCharm > Preferences > Editor > Code Style > Python
- 设置行长度: 在 Hard wrap at 中设置为 88 或 120(根据团队规范)。
- 启用 PEP 8 检查: 转到 File > Settings > Editor > Inspections。 搜索 PEP 8 coding style violation,确保勾选。
- 实时检查: 代码中不符合 PEP 8 的部分会高亮显示(黄色波浪线)。 将鼠标悬停在高亮处,查看建议修复方法。
2. 使用 PyCharm 自动格式化代码
PyCharm 集成了类似 black 的格式化功能,支持一键格式化。
步骤:
- 格式化整个文件: 快捷键:Ctrl+Alt+L(Windows/Linux)或 Cmd+Option+L(macOS)。 或者:Code > Reformat Code。
- 配置格式化工具: 在 File > Settings > Tools > Actions on Save 中,勾选 Reformat code 和 Optimize imports。 每次保存时,PyCharm 自动格式化代码并优化导入。
- 使用外部工具(如 black): 安装 black:pip install black。 在 PyCharm 中配置: File > Settings > Tools > External Tools。 添加 black 命令:black $FilePath$。 通过 Tools > External Tools > black 运行。
3. 使用 PyCharm 进行代码检查
PyCharm 提供静态分析,检测 PEP 8 问题、语法错误和潜在 bug。
步骤:
- 运行代码检查: Code > Inspect Code。 选择 Whole project 或特定文件,查看检查结果。
- 修复建议: 在 Inspection Results 面板中,双击问题,跳转到代码。 使用 Alt+Enter 快捷键,应用 PyCharm 的自动修复建议(如添加空格、优化导入)。
重构:整洁性、可读性、复用性
以下通过一个复杂示例,展示如何使用 PyCharm 重构代码,优化 整洁性、可读性 和 复用性。
示例业务场景
假设我们有一个 库存管理系统,包含以下功能:
- 管理商品(名称、价格、库存量)。
- 处理订单(添加商品、计算总价)。
- 检查库存是否足够。
原始代码(存在问题)
python
# inventory_system.py
def process_order(order_id,items,customer_name): # 不规范的命名,参数过多
total=0
for item in items:
name=item[0];price=item[1];quantity=item[2]
if quantity>item[3]: # 库存检查,魔法数字
print(f"Not enough stock for {name}")
return False
total+=price*quantity
if total>100:total=total*0.9 # 硬编码折扣,逻辑不清晰
print(f"Order {order_id} for {customer_name}: ${total}") # 直接打印,缺乏结构
return True
class inventory: # 类名不规范
def __init__(self):
self.items=[['Book',29.99,10,100],['Pen',1.99,50,200]] # 数据结构不直观,硬编码
def get_item(self,name):
for item in self.items:
if item[0]==name:
return item
return None
代码问题:
- 整洁性: 函数 process_order 过长,职责不单一(订单处理 + 折扣 + 输出)。 硬编码数据(如折扣率 0.9、库存数据)。 数据结构不清晰(列表嵌套列表)。
- 可读性: 命名不规范(inventory 未用 CamelCase,变量名如 items 缺乏描述性)。 缺少注释和文档,逻辑难以理解。 魔法数字(如 100、0.9)无说明。
- 复用性: 库存和订单逻辑耦合,难以单独测试或重用。 没有模块化设计,无法扩展(如添加新折扣规则)。
使用 PyCharm 重构代码
1. 重构步骤
使用 PyCharm 的重构工具,结合手动优化,改进代码。
步骤:
- 重命名: 将类 inventory 重命名为 Inventory。 在 PyCharm 中,右键类名 > Refactor > Rename,输入 Inventory。 PyCharm 自动更新所有引用。 将函数 process_order 重命名为 process_customer_order。 同样使用 Refactor > Rename,确保描述性命名。
- 提取方法: 将 process_order 中的折扣逻辑提取为单独方法。 选中折扣代码(if total>100:total=total*0.9)。 使用 Code > Refactor > Extract > Method,命名为 apply_discount。 将库存检查逻辑提取为方法 check_stock。
- 优化数据结构: 将嵌套列表替换为 Product 类,清晰表示商品。 使用 PyCharm 的 Refactor > Extract > Class 创建 Product 类。
- 格式化代码: 使用 Ctrl+Alt+L 格式化代码,应用 PEP 8 规范。 优化导入:Code > Optimize Imports。
- 添加文档和类型注解: 使用 PyCharm 的代码补全(Alt+Enter)添加 docstring 和类型注解。
2. 重构后的代码
python
# inventory_system.py
from dataclasses import dataclass
from typing import List
@dataclass
class Product:
"""表示库存中的商品"""
name: str
price: float
quantity: int
stock: int
class Inventory:
"""管理商品库存"""
def __init__(self):
self.products = [
Product(name="Book", price=29.99, quantity=10, stock=100),
Product(name="Pen", price=1.99, quantity=50, stock=200),
]
def get_product(self, name: str) -> Product | None:
"""根据名称查找商品"""
for product in self.products:
if product.name == name:
return product
return None
def check_stock(self, product: Product, quantity: int) -> bool:
"""检查商品库存是否足够"""
return product.stock >= quantity
class OrderProcessor:
"""处理客户订单"""
def __init__(self, inventory: Inventory):
self.inventory = inventory
def apply_discount(self, total: float) -> float:
"""应用折扣规则:总价超过100时打9折"""
if total > 100:
return total * 0.9
return total
def process_customer_order(
self, order_id: str, items: List[tuple[str, int]], customer_name: str
) -> bool:
"""处理订单,计算总价并检查库存
Args:
order_id: 订单ID
items: 商品名称和数量的列表
customer_name: 客户姓名
Returns:
bool: 订单是否成功处理
"""
total = 0.0
for item_name, quantity in items:
product = self.inventory.get_product(item_name)
if not product:
print(f"Product {item_name} not found")
return False
if not self.inventory.check_stock(product, quantity):
print(f"Not enough stock for {item_name}")
return False
total += product.price * quantity
total = self.apply_discount(total)
print(f"Order {order_id} for {customer_name}: ${total:.2f}")
return True
重构后的改进:
- 整洁性: 使用 dataclass 定义 Product,取代嵌套列表,结构更清晰。 将订单处理逻辑拆分为 OrderProcessor 类,职责单一。 提取 apply_discount 和 check_stock 方法,消除长函数。 移除硬编码,折扣规则可配置。
- 可读性: 添加类型注解(str, float, List),明确参数和返回值类型。 使用 docstring 描述类和方法的功能。 命名更具描述性(如 process_customer_order、get_product)。 格式化代码(Ctrl+Alt+L),符合 PEP 8。
- 复用性: Inventory 和 OrderProcessor 分离,各自负责库存管理和订单处理。 Product 类可复用于其他模块(如销售报表)。 折扣逻辑独立为 apply_discount,易于扩展(如添加新折扣规则)。
3. PyCharm 重构的其他功能
PyCharm 提供更多重构工具,进一步优化代码:
- 提取变量/常量: 选中魔法数字(如 100 或 0.9)。 使用 Refactor > Extract > Constant,定义为常量(如 DISCOUNT_THRESHOLD = 100)。
- 内联(Inline): 如果方法过于简单(如 get_product),可内联到调用处。 右键方法 > Refactor > Inline。
- 移动代码: 将 Product 类移动到单独文件(如 models.py)。 右键类名 > Refactor > Move。
- 更改签名: 修改 process_customer_order 的参数(如添加折扣参数)。 右键方法 > Refactor > Change Signature。
练习:重构你的项目
- 选择项目: 选择一个包含多个类或函数的项目(如之前的命令行工具、API 客户端)。 确保有至少 100 行代码,包含复杂逻辑。
- 使用 PyCharm 检查和格式化: 运行 Code > Inspect Code,修复 PEP 8 问题。 使用 Ctrl+Alt+L 格式化代码。 优化导入(Code > Optimize Imports)。
- 重构代码: 整洁性: 提取长函数为小方法(Refactor > Extract > Method)。 消除重复代码,定义可复用函数或类。 可读性: 重命名变量/函数(Refactor > Rename),使用描述性名称。 添加 docstring 和类型注解。 复用性: 将通用逻辑提取为独立模块或类。 使用 Refactor > Move 将代码组织到合适的文件。
- 验证: 运行项目,确保功能未受影响。 使用 pytest 或 unittest 编写测试用例,验证重构后的代码。 检查覆盖率(pip install coverage)。
- PyCharm 是强大的代码风格和重构工具,通过 PEP 8 检查、自动格式化和重构功能,显著提升代码质量。
- 重构的目标是优化 整洁性(清晰结构)、可读性(易懂命名和文档)、复用性(模块化设计)。
- 示例中的库存管理系统展示了如何从混乱代码到整洁代码的转变,PyCharm 的重构工具(如重命名、提取方法)简化了这一过程。
- 通过练习,你可以掌握 PyCharm 的高级功能,并在实际项目中应用重构技巧。