代码风格与规范

2. 代码风格与规范

代码风格与规范是编写高质量软件的基础。良好的代码风格不仅提升代码的可读性和可维护性,还促进团队协作,减少潜在的错误。以下内容将详细介绍在Python开发中需要注意的关键点。

2.1 遵循PEP 8代码风格指南

什么是PEP 8?

PEP 8(Python Enhancement Proposal 8)是Python官方的编码风格指南,旨在规范Python代码的格式和风格,促进代码的一致性和可读性。

PEP 8的主要内容

  1. 缩进

    • 推荐使用4个空格进行缩进
    • 避免使用Tab键,因为不同编辑器对Tab的处理可能不一致。
    # 正确示例
    def function():
        if True:
            print("Hello, World!")
    
    # 错误示例
    def function():if True:
    ↹↹print("Hello, World!")
    
  2. 行长度

    • 每行不超过79个字符
    • 对于注释和文档字符串,每行不超过72个字符。
    # 正确示例
    def long_function_name(var_one, var_two, var_three,
                           var_four):
        print(var_one)
    
    # 错误示例
    def long_function_name(var_one, var_two, var_three, var_four):
        print(var_one)
    
  3. 空行

    • 顶层定义(如函数和类定义)之间用两个空行分隔。
    • 类中的方法定义之间用一个空行分隔。
    # 正确示例
    class MyClass:
    
        def method_one(self):
            pass
    
        def method_two(self):
            pass
    
    
    def function_one():
        pass
    
    
    def function_two():
        pass
    
  4. 导入

    • 每个导入语句单独一行
    • 导入顺序:标准库导入、第三方库导入、本地应用/库的导入,各部分之间用一个空行分隔。
    # 正确示例
    import os
    import sys
    
    import requests
    from sqlalchemy.orm import Session
    
    from my_package import my_module
    
    # 错误示例
    import os, sys
    from sqlalchemy.orm import Session, declarative_base
    import requests, json
    from my_package import my_module, another_module
    
  5. 空格的使用

    • 避免在逗号、分号、冒号前添加空格,在其后添加一个空格。
    • 函数调用时,函数名与括号之间不要有空格。
    • 函数定义时,参数列表括号内不要有空格。
    # 正确示例
    function(arg1, arg2)
    list_of_items = [1, 2, 3]
    x = 1
    y = 2
    
    def function(arg1, arg2):
        pass
    
    # 错误示例
    function( arg1, arg2 )
    list_of_items = [1,2,3]
    x=1
    y =2
    
    def function( arg1, arg2 ):
        pass
    
  6. 注释

    • 注释应清晰、有意义,解释“为什么”而不是“做什么”。
    • 块注释:用 # 开头,紧跟一个空格。
    • 行内注释:与代码至少有两个空格分隔,注释前加 #
    # 正确示例
    # 计算用户年龄
    user_age = current_year - birth_year
    
    def calculate_age(current_year, birth_year):
        age = current_year - birth_year  # 计算年龄
        return age
    
    # 错误示例
    #计算用户年龄
    user_age=current_year - birth_year
    
    def calculate_age(current_year, birth_year):
        age = current_year - birth_year #计算年龄
        return age
    
  7. 文档字符串

    • 使用三引号(“”") 来编写多行文档字符串。
    • 文档字符串应简洁明了,描述模块、类或函数的用途。
    # 正确示例
    def add(a, b):
        """
        返回两个数的和。
        
        参数:
            a (int): 第一个数字。
            b (int): 第二个数字。
        
        返回:
            int: 两数之和。
        """
        return a + b
    
    # 错误示例
    def add(a, b):
        # 返回和
        return a + b
    

遵循PEP 8的好处

  • 提高代码可读性:一致的格式使代码更易于阅读和理解。
  • 促进团队协作:统一的编码风格减少了代码审查和维护的难度。
  • 减少错误:良好的格式和清晰的结构有助于发现潜在的错误。

如何遵循PEP 8

  1. 手动遵循:在编写代码时,参考PEP 8指南进行格式化。

  2. 使用工具自动格式化

    • Black

      :一个流行的代码格式化工具,可以自动将代码格式化为PEP 8标准。

      pip install black
      black your_script.py
      
    • Flake8

      :一个用于检查代码风格的工具,能发现PEP 8违规。

      pip install flake8
      flake8 your_script.py
      
    • PyCharmVSCode等IDE通常内置或支持插件,以自动格式化和检查代码风格。


2.2 编写可读性高、维护性强的代码

代码可读性的重要性

  • 易于理解:代码应当像阅读英语一样易于理解,便于团队成员快速掌握功能。
  • 减少错误:可读性高的代码更容易发现和修复错误。
  • 便于维护和扩展:清晰的代码结构使得后续的维护和功能扩展更加高效。

提升代码可读性的技巧

  1. 合理的代码组织

    • 将相关功能封装在函数、类或模块中。
    • 避免长函数或类,遵循单一职责原则(SRP)。
  2. 使用清晰的控制结构

    • 避免过多的嵌套,使用早期返回(early return)减少嵌套层级。
    • 使用for循环代替复杂的while循环,除非必要。
    # 复杂嵌套示例
    def process_items(items):
        for item in items:
            if item.is_valid():
                if not item.is_processed():
                    item.process()
    
    # 优化后的示例
    def process_items(items):
        for item in items:
            if not item.is_valid():
                continue
            if item.is_processed():
                continue
            item.process()
    
  3. 注释与文档

    • 在复杂的逻辑或算法旁添加注释,解释“为什么”而不是“做什么”。
    • 使用文档字符串描述模块、类和函数的用途和使用方法。
  4. 避免魔法数字和字符串

    • 将常量定义在变量中,赋予有意义的名称。
    # 魔法数字示例
    if user_age > 18:
        pass
    
    # 改进后的示例
    ADULT_AGE = 18
    if user_age > ADULT_AGE:
        pass
    
  5. 保持一致性

    • 在整个项目中保持一致的编码风格和命名约定。
    • 使用相同的模式和方法解决类似的问题。
  6. 使用函数和类

    • 将重复的代码抽象为函数或类方法,避免代码重复。
    • 使用面向对象编程(OOP)原则,如继承、多态,提高代码复用性。

提升代码维护性的技巧

  1. 模块化设计
    • 将代码拆分为独立、可重用的模块,便于单独测试和维护。
  2. 遵循单一职责原则(SRP)
    • 每个函数、类或模块应仅负责一个功能或职责。
  3. 编写测试
    • 为关键功能编写单元测试和集成测试,确保代码的正确性和稳定性。
  4. 持续重构
    • 定期审查和优化代码结构,消除代码异味(code smells)。
  5. 使用版本控制
    • 使用Git等版本控制工具跟踪代码变更,便于回溯和协作。

2.3 使用有意义的命名

命名的重要性

  • 提升可读性:清晰、有意义的名称使代码更易理解。
  • 自解释代码:好的命名可以减少对注释的依赖。
  • 减少错误:避免混淆和命名冲突,减少因名称误用导致的错误。

命名规范

  1. 变量名

    • 使用小写字母和下划线,遵循snake_case命名风格。
    • 避免单字符变量名,除非在非常短的上下文中(如循环计数器)。
    # 正确示例
    user_age = 25
    total_amount = 100.50
    
    # 错误示例
    a = 25
    totalAmt = 100.50
    
  2. 函数名

    • 使用动词或动词短语,描述函数的行为。
    • 使用小写字母和下划线,遵循snake_case命名风格。
    # 正确示例
    def calculate_total(amount, tax):
        return amount + tax
    
    def send_email(recipient, subject, body):
        pass
    
    # 错误示例
    def calculateTotal(amount, tax):
        return amount + tax
    
    def sendEmail(r, s, b):
        pass
    
  3. 类名

    • 使用名词或名词短语,描述类的实体。
    • 采用驼峰命名法(CamelCase),每个单词首字母大写。
    # 正确示例
    class User:
        pass
    
    class OrderProcessor:
        pass
    
    # 错误示例
    class user:
        pass
    
    class order_processor:
        pass
    
  4. 常量名

    • 使用全大写字母和下划线,如MAX_SIZE
    # 正确示例
    MAX_CONNECTIONS = 100
    TIMEOUT_DURATION = 30
    
    # 错误示例
    max_connections = 100
    timeoutDuration = 30
    
  5. 避免使用缩写和模糊名称

    • 使用全称或清晰的缩写,避免不常见的缩写和模糊的名称。
    # 正确示例
    customer_address = "123 Main St"
    html_content = "<p>Hello</p>"
    
    # 错误示例
    cust_addr = "123 Main St"
    htm = "<p>Hello</p>"
    
  6. 一致性

    • 在整个项目中保持命名风格的一致性,避免混用不同的命名风格。

命名示例

# 正确示例
class UserProfile:
    def __init__(self, username, email):
        self.username = username
        self.email = email

def send_welcome_email(user_profile):
    pass

MAX_LOGIN_ATTEMPTS = 5

# 错误示例
class userprofile:
    def __init__(self, user, mail):
        self.user = user
        self.mail = mail

def sendEmail(up):
    pass

maxLoginAttempts = 5

2.4 保持代码简洁,避免冗余

代码简洁的重要性

  • 提升可读性:简洁的代码更容易理解和维护。
  • 减少错误:冗余代码可能引入不必要的错误和复杂性。
  • 提高效率:简洁的代码通常更高效,执行速度更快。

保持代码简洁的技巧

  1. 遵循DRY原则(Don’t Repeat Yourself)

    • 避免代码重复,将重复的逻辑抽象为函数、类或模块。
    # 重复代码示例
    def process_user(user):
        print(f"Processing user: {user.name}")
        # 其他处理逻辑
    
    def process_admin(admin):
        print(f"Processing admin: {admin.name}")
        # 其他处理逻辑
    
    # 优化后的示例
    def process_entity(entity):
        print(f"Processing entity: {entity.name}")
        # 其他处理逻辑
    
  2. 使用内置函数和库

    • 充分利用Python的内置函数和标准库,避免重新实现已有功能。
    # 不推荐:重新实现列表求和
    def sum_list(numbers):
        total = 0
        for num in numbers:
            total += num
        return total
    
    # 推荐:使用内置sum函数
    def sum_list(numbers):
        return sum(numbers)
    
  3. 避免过度复杂的表达式

    • 拆分复杂的表达式,使其更易理解。
    # 复杂表达式示例
    result = (a * b + c) / (d - e) if d != e else 0
    
    # 优化后的示例
    if d != e:
        numerator = a * b + c
        denominator = d - e
        result = numerator / denominator
    else:
        result = 0
    
  4. 使用列表推导式和生成器表达式

    • 简化循环和过滤逻辑,提高代码简洁性。
    # 不推荐:使用循环生成列表
    squares = []
    for x in range(10):
        squares.append(x**2)
    
    # 推荐:使用列表推导式
    squares = [x**2 for x in range(10)]
    
  5. 删除无用的代码

    • 定期清理未使用的变量、函数和模块,保持代码库整洁。
    # 有无用代码的示例
    def calculate_area(radius):
        pi = 3.14159
        unused_variable = 42
        return pi * radius * radius
    
    # 优化后的示例
    def calculate_area(radius):
        pi = 3.14159
        return pi * radius * radius
    
  6. 使用函数和类封装逻辑

    • 将相关的代码逻辑封装在函数或类中,提高代码的模块化和复用性。
    # 不推荐:在主程序中处理所有逻辑
    def main():
        users = load_users()
        for user in users:
            process_user(user)
        save_results()
    
    # 推荐:封装逻辑到函数中
    def load_users():
        pass
    
    def process_user(user):
        pass
    
    def save_results():
        pass
    
    def main():
        users = load_users()
        for user in users:
            process_user(user)
        save_results()
    

代码简洁示例

# 不推荐的冗余代码
def greet_user(name):
    print("Hello, " + name + "!")

def greet_admin(name):
    print("Hello, " + name + "! You have admin privileges.")

# 推荐的简洁代码
def greet(name, role="User"):
    greeting = f"Hello, {name}!"
    if role == "Admin":
        greeting += " You have admin privileges."
    print(greeting)

# 使用
greet("Alice")
greet("Bob", role="Admin")

总结

作为入门级Python后端开发工程师,遵循良好的代码风格与规范是提升代码质量和团队协作效率的关键。以下是关键点的回顾:

  1. 遵循PEP 8代码风格指南
    • 了解并应用PEP 8的主要规范,如缩进、行长度、空行、导入顺序、空格使用、注释和文档字符串。
    • 使用工具(如Black、Flake8)自动格式化和检查代码风格。
  2. 编写可读性高、维护性强的代码
    • 合理组织代码,使用清晰的控制结构。
    • 添加有意义的注释和文档字符串。
    • 避免魔法数字和字符串,保持代码一致性。
  3. 使用有意义的命名
    • 采用清晰、描述性的命名风格,使用snake_case、CamelCase等约定。
    • 避免使用缩写和模糊名称,保持命名的一致性。
  4. 保持代码简洁,避免冗余
    • 遵循DRY原则,避免代码重复。
    • 利用Python内置函数和标准库,简化代码逻辑。
    • 拆分复杂表达式,使用列表推导式和生成器表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

决策回归树【原理/算例/决策回归树 VS 线性回归】

决策回归树 1. 决策回归树原理2. 决策回归树算例3. 手动计算MSE和最优划分属性4. 决策回归树 VS 线性回归 1. 决策回归树原理 决策回归树&#xff0c;虽然叫做“回归”树&#xff0c;但是它的本质还是分类算法&#xff0c;只是分的类别多一点。 1. 回归树的裂分指标 回归树种&…

基于STM32的智能鱼缸控制系统的Proteus仿真

文章目录 一、智能鱼缸控制系统1.题目要求2.思路2.1 主控2.2 传感器2.3 按键2.4 声光报警2.5 自动换水&#xff0c;喂食&#xff0c;供氧2.6 OLED显示2.7 电源部分2.8 远程终端 3.电路仿真3.1 未仿真时3.2 开始仿真&#xff0c;正常显示3.3 按下设置按键&#xff0c;进入阈值界…

【Python爬虫】Scrapy框架实战---百度首页热榜新闻

如何利用Scrapy框架实战提取百度首页热榜新闻的排名、标题和链接 一、安装Scrapy库 二、创建项目&#xff08;以BaiduSpider为例&#xff09; scrapy startproject BaiduSpider生成每个文件的功能&#xff1a; 二、 创建爬虫脚本&#xff08;爬虫名&#xff1a;news&#xff…

mysql-分析MVCC原理

一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制&#xff0c;也就是为事务分配单增长的时间戳&#xff0c;为每个修改保存一个版本&#xff0c;版本与事务时间戳关联&#xff0c;读操作只读该事务开始前的数据库的快照&#xff0c;所以MVCC可以为数据库解决一些问题。…

论文笔记:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

1. 挑战/问题&#xff08;Challenges/Issues&#xff09;&#xff1a; 这篇论文探讨了大型预训练语言模型在处理知识密集型自然语言处理&#xff08;NLP&#xff09;任务时面临的挑战。尽管这些模型在参数中存储了大量事实知识&#xff0c;并在微调后能够在下游NLP任务中取得很…

嵌入式硬件电子电路设计(六)LDO低压差线性稳压器全面详解

引言&#xff1a; LDO&#xff08;Low Dropout Regulator&#xff0c;低压差线性稳压器&#xff09;是一种常用的电源管理组件&#xff0c;用于提供稳定的输出电压&#xff0c;同时允许较小的输入电压与输出电压之间的差值。LDO广泛应用于各种电子设备中&#xff0c;特别是在对…

Spring:AOP面向切面案例讲解AOP核心概念

Spring的AOP&#xff0c;在不惊动(改动)原有设计(代码)的前提下&#xff0c;想给谁添加功能就给谁添加。这个也就是Spring的理念&#xff1a; 无入侵式/无侵入式 AOP中核心概念分别指的是什么? 连接点切入点通知通知类切面 下面以一个例子进行讲解&#xff0c;直接上代码&a…

禁止Chrome的自动升级

一、需求分析 因为用Chromeselenium做了网页自动化填写任务&#xff0c;如果Google Chrome浏览器自动升级&#xff0c;就会导致chromedriver加载失败&#xff0c;自动化任务失效&#xff0c;因此需要禁止Chrome浏览器的自动升级。 二、当前环境 三、实际配置 运行注册表编辑…

2024年wordpress、d-link等相关的多个cve漏洞poc

⚠️ 漏洞 ✅ CVE-2024-10914 在D-Link DNS-320、DNS-320LW、DNS-325和DNS-340L中发现的漏洞&#xff0c;版本直到20241028 GET /cgi-bin/account_mgr.cgi?cmdcgi_user_add&name%27;id;%27 HTTP/1.1✅ CVE-2024-11305 在Altenergy Power Control Software中发现的关键…

Spring框架特性及包下载(Java EE 学习笔记04)

1 Spring 5的新特性 Spring 5是Spring当前最新的版本&#xff0c;与历史版本对比&#xff0c;Spring 5对Spring核心框架进行了修订和更新&#xff0c;增加了很多新特性&#xff0c;如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上&#xff0c;所以Spri…

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia、axios 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&…

WPF中的登录界面

创建如下的目录结构&#xff1a; 2.在App.xaml.cs中设置为先登录验证之后再进入主页面 using Prism.Ioc; using System.Windows; using 校园访客系统.Views;namespace 校园访客系统 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partia…

ros2学习日记_241124_ros相关链接

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

如果在docker 容器中安装ros遇到的问题

1.在容器内部无法修改时间&#xff0c;需要在宿主机外边修改时钟。修改时钟&#xff1a; hwclock --systohc或者执行 date -s "2024-11-24 19:25:10"2.容器内部内置有opencv4.5版本&#xff0c;需要卸载&#xff0c;重新安装4.2.0版本。记录折腾好久的卸载过程。 …

排序(Java数据结构)

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。(所有的排序都是默认从小到大排序) 稳定性&#xff1a;假定在待排序的记录序列中&#xff…

AutoDL安装docker问题

在AutoDL上租了卡&#xff0c;安装docker遇到一些问题&#xff1a; 1.执行 sudo docker run hello-world 报错 docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决方法 先查看docker有没有启动&#xff0c;…

ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)

今天介绍一下ArcGIS中定义投影与投影的区别。 给大家解惑一下为什么经常出现自己的数据无法和底图套合的情况。 一 目录 1、ArcGIS定义投影与投影的概念区别 2、ArcGIS定义正确的坐标系 3、ArcGIS动态投影实现套合 4、ArcGIS地理坐标系转投影坐标系&#xff08;错误做法&am…

ChatGPT 桌面版发布了,如何安装?

本章教程教大家如何进行安装。 一、下载安装包 官网地址地址&#xff1a;https://openai.com/chatgpt/desktop/ 支持Windows和MacOS操作系统 二、安装步骤 Windows用户下载之后&#xff0c;会有一个exe安装包&#xff0c;点击运行安装即可。 注意事项&#xff0c;如果Windows操…