Python进阶-day20: 代码风格与工具

liftword4周前 (04-26)技术文章13

目标

  • 深入理解 PEP 8 规范及其对代码整洁性的影响。
  • 使用 PyCharm 内置工具进行代码检查、格式化和重构。
  • 通过重构示例,展示如何提升代码的 整洁性(结构清晰)、可读性(易于理解)、复用性(模块化设计)。
  • 练习:重构一个复杂项目,优化代码质量并验证效果。

术语解释

  1. PEP 8: Python 的官方代码风格指南,涵盖命名、缩进、空格、注释等。 目标:统一代码风格,增强团队协作效率。 关键规则: 缩进:4 个空格。 行长度:建议 79 字符(现代项目常用 88 或 120)。 命名:函数和变量用 snake_case,类用 CamelCase。 注释:清晰、简洁,避免冗余。
  2. PyCharm: JetBrains 开发的 Python IDE,提供强大的代码检查、格式化和重构工具。 内置支持 PEP 8 检查、自动格式化、代码重构(如重命名、提取方法)和静态分析。
  3. 代码重构: 在不改变代码功能的前提下,改进其结构、命名或设计。 目标: 整洁性:消除代码异味(如长函数、重复代码),使结构更简洁。 可读性:通过清晰的命名、注释和格式,让代码易于理解。 复用性:通过模块化设计和抽象,提升代码的通用性和可维护性。
  4. 代码异味(Code Smell): 代码中可能导致维护困难的潜在问题,如长函数、重复代码、复杂条件语句等。 重构的目标是消除这些异味。

使用 PyCharm 进行代码格式化与检查

1. 配置 PyCharm 的 PEP 8 检查

PyCharm 内置了 PEP 8 检查工具,可以实时提示风格问题。

步骤

  1. 打开 PyCharm 设置: Windows/Linux:File > Settings > Editor > Code Style > Python macOS:PyCharm > Preferences > Editor > Code Style > Python
  2. 设置行长度: 在 Hard wrap at 中设置为 88 或 120(根据团队规范)。
  3. 启用 PEP 8 检查: 转到 File > Settings > Editor > Inspections。 搜索 PEP 8 coding style violation,确保勾选。
  4. 实时检查: 代码中不符合 PEP 8 的部分会高亮显示(黄色波浪线)。 将鼠标悬停在高亮处,查看建议修复方法。

2. 使用 PyCharm 自动格式化代码

PyCharm 集成了类似 black 的格式化功能,支持一键格式化。

步骤

  1. 格式化整个文件: 快捷键:Ctrl+Alt+L(Windows/Linux)或 Cmd+Option+L(macOS)。 或者:Code > Reformat Code。
  2. 配置格式化工具: 在 File > Settings > Tools > Actions on Save 中,勾选 Reformat code 和 Optimize imports。 每次保存时,PyCharm 自动格式化代码并优化导入。
  3. 使用外部工具(如 black): 安装 black:pip install black。 在 PyCharm 中配置: File > Settings > Tools > External Tools。 添加 black 命令:black $FilePath$。 通过 Tools > External Tools > black 运行。

3. 使用 PyCharm 进行代码检查

PyCharm 提供静态分析,检测 PEP 8 问题、语法错误和潜在 bug。

步骤

  1. 运行代码检查: Code > Inspect Code。 选择 Whole project 或特定文件,查看检查结果。
  2. 修复建议: 在 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

代码问题

  1. 整洁性: 函数 process_order 过长,职责不单一(订单处理 + 折扣 + 输出)。 硬编码数据(如折扣率 0.9、库存数据)。 数据结构不清晰(列表嵌套列表)。
  2. 可读性: 命名不规范(inventory 未用 CamelCase,变量名如 items 缺乏描述性)。 缺少注释和文档,逻辑难以理解。 魔法数字(如 100、0.9)无说明。
  3. 复用性: 库存和订单逻辑耦合,难以单独测试或重用。 没有模块化设计,无法扩展(如添加新折扣规则)。

使用 PyCharm 重构代码

1. 重构步骤

使用 PyCharm 的重构工具,结合手动优化,改进代码。

步骤

  1. 重命名: 将类 inventory 重命名为 Inventory。 在 PyCharm 中,右键类名 > Refactor > Rename,输入 Inventory。 PyCharm 自动更新所有引用。 将函数 process_order 重命名为 process_customer_order。 同样使用 Refactor > Rename,确保描述性命名。
  2. 提取方法: 将 process_order 中的折扣逻辑提取为单独方法。 选中折扣代码(if total>100:total=total*0.9)。 使用 Code > Refactor > Extract > Method,命名为 apply_discount。 将库存检查逻辑提取为方法 check_stock。
  3. 优化数据结构: 将嵌套列表替换为 Product 类,清晰表示商品。 使用 PyCharm 的 Refactor > Extract > Class 创建 Product 类。
  4. 格式化代码: 使用 Ctrl+Alt+L 格式化代码,应用 PEP 8 规范。 优化导入:Code > Optimize Imports。
  5. 添加文档和类型注解: 使用 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

重构后的改进

  1. 整洁性: 使用 dataclass 定义 Product,取代嵌套列表,结构更清晰。 将订单处理逻辑拆分为 OrderProcessor 类,职责单一。 提取 apply_discount 和 check_stock 方法,消除长函数。 移除硬编码,折扣规则可配置。
  2. 可读性: 添加类型注解(str, float, List),明确参数和返回值类型。 使用 docstring 描述类和方法的功能。 命名更具描述性(如 process_customer_order、get_product)。 格式化代码(Ctrl+Alt+L),符合 PEP 8。
  3. 复用性: Inventory 和 OrderProcessor 分离,各自负责库存管理和订单处理。 Product 类可复用于其他模块(如销售报表)。 折扣逻辑独立为 apply_discount,易于扩展(如添加新折扣规则)。

3. PyCharm 重构的其他功能

PyCharm 提供更多重构工具,进一步优化代码:

  1. 提取变量/常量: 选中魔法数字(如 100 或 0.9)。 使用 Refactor > Extract > Constant,定义为常量(如 DISCOUNT_THRESHOLD = 100)。
  2. 内联(Inline): 如果方法过于简单(如 get_product),可内联到调用处。 右键方法 > Refactor > Inline。
  3. 移动代码: 将 Product 类移动到单独文件(如 models.py)。 右键类名 > Refactor > Move。
  4. 更改签名: 修改 process_customer_order 的参数(如添加折扣参数)。 右键方法 > Refactor > Change Signature。

练习:重构你的项目

  1. 选择项目: 选择一个包含多个类或函数的项目(如之前的命令行工具、API 客户端)。 确保有至少 100 行代码,包含复杂逻辑。
  2. 使用 PyCharm 检查和格式化: 运行 Code > Inspect Code,修复 PEP 8 问题。 使用 Ctrl+Alt+L 格式化代码。 优化导入(Code > Optimize Imports)。
  3. 重构代码整洁性: 提取长函数为小方法(Refactor > Extract > Method)。 消除重复代码,定义可复用函数或类。 可读性: 重命名变量/函数(Refactor > Rename),使用描述性名称。 添加 docstring 和类型注解。 复用性: 将通用逻辑提取为独立模块或类。 使用 Refactor > Move 将代码组织到合适的文件。
  4. 验证: 运行项目,确保功能未受影响。 使用 pytest 或 unittest 编写测试用例,验证重构后的代码。 检查覆盖率(pip install coverage)。

  • PyCharm 是强大的代码风格和重构工具,通过 PEP 8 检查、自动格式化和重构功能,显著提升代码质量。
  • 重构的目标是优化 整洁性(清晰结构)、可读性(易懂命名和文档)、复用性(模块化设计)。
  • 示例中的库存管理系统展示了如何从混乱代码到整洁代码的转变,PyCharm 的重构工具(如重命名、提取方法)简化了这一过程。
  • 通过练习,你可以掌握 PyCharm 的高级功能,并在实际项目中应用重构技巧。

相关文章

Python单元测试最佳实践指南:编写高效测试的7个核心技巧

作为Python开发者,编写单元测试是最值得培养(并不断提升)的优秀习惯之一。它能帮助您及早发现错误、简化调试过程,并让您有信心进行代码修改而不破坏现有功能。但并非所有测试都具有同等价值!如果测试代码...

python四个性能检测工具,包括函数的运行内存、时间等等...

这里总结了五个比较好的python性能检测工具,包括内存使用、运行时间、执行次数等方面。首先,来编写一个基础的python函数用于在后面的各种性能测试。def base_func(): for...

Python实现YOLOv8车道线与车辆检测

以下是一个基于YOLOv8和OpenCV实现车道线与车辆检测的Python示例代码,结合了深度学习目标检测和传统图像处理技术:pythonimport cv2import numpy as npfro...

Python进阶-day19: 测试与调试

一、课程目标理解测试的重要性:掌握软件测试的基本概念,了解单元测试在提高代码质量和可维护性中的作用。学习测试框架:熟悉Python中两种主流测试框架unittest和pytest的使用方法,理解它们的...

Python 中测量经过时间的方法

在 Python 编程里,我们常常会遇到需要测量一段代码执行所经过时间的情况,这有助于我们评估代码的性能,找出性能瓶颈并进行优化。那在 Python 中,要如何测量经过的时间呢?接下来就为大家详细介绍...

如何判断deep seek生成的代码是否符合项目的性能要求

要判断生成的代码是否符合项目的性能要求,可以从多个维度进行评估,下面为你详细介绍这些评估方法。1. 时间复杂度分析理论计算:依据代码里的算法和数据结构,从理论层面计算其时间复杂度。例如,对于一个简单的...