一个例子了解如何编写可维护的Python代码

如何在PyTorch中编写高效、可维护的Python代码? 本文介绍了在PyTorch中编写高效、可维护Python代码的最佳实践。首先强调遵循PEP 8规范、使用类型注解和文档字符串提高代码可读性。针对PyTorch开发,建议使用torch.device管理设备、DataLoader优化数据加载,并妥善管理模型状态。性能优化方面,推荐混合精度训练、no_grad()推理和并行化计算。此外,介绍了模型调试工具(如torchsummary)和TensorBoard可视化方法。最后提出模块化设计、避免硬编码等提升代码可扩展性的建议,帮助开发者构建更健壮的深度学习项目。 阅读详情

大家好,我是海鸽。

今天,我们将从可维护性角度来介绍 Python 编码规范,思考如何像一个“工匠”一样,把代码雕琢得如同完美的手工艺品一样让人赏心悦目。

引子:一个改编自生产的例子

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51
import json
import urllib.request


def get(endpoint, student):
    result = None  # 初始化名称
    try:
        info1 = urllib.request.urlopen(f"{endpoint}/student/{student}/")  # 获取学生信息
        if info1.status_code == 200:  # 判断状态码
            result1 = json.loads(info1.read())  # 解析学生信息
            info1.close()  # 关闭请求

            result2 = urllib.request.urlopen(f"{endpoint}/class/{result1['class']}/")  # 请求班级信息
            if result2.status_code == 200:
                info2 = json.loads(result2.read())
                result = info2["name"]  # 获取班级名称
                result2.close()
            else:  # 如果状态码不等于200,返回unknown
                result2.close()

        else:
            info1.close()

    except Exception as e:
        return "unknown"

    return result

相信大部分人如果看到这样一段代码,都会在心里把写这样代码的人狠狠的鄙视一番。

这个代码的唯一没问题的点可能仅仅是"代码能跑"。

我们可以从以下几个方面来进行优化。

变量名命名技巧

变量名的基本规范

包名、模块名、局部变量名、函数名:

  • 全小写 + 下划线式驼峰:this_is_var

全局变量、常量:

  • 全大写 + 下划线式驼峰:GLOBAL_VAL

类名:

  • 首字母大写式驼峰:ClassName()

使用驼峰式时,缩写全部大写,例如:HTTPServerError 好于 HttpServerError

变量名要有描述性

  • 不要用那些过于宽泛的词
# BAD 
day, host, cards, temp
  • 在可接受的长度范围内,变量名能把它所指向的内容描述的越精确越好
# GOOD
day_of_week, host_to_reboot, expired_cards

良好的命名使人能够轻松推断变量的类型

  • python 是一门动态类型语言,除了通过上下文猜测,没法轻易知道它是什么类型。
  • PEP 484 为 python 添加了类型注解

什么样的名字会被当成 bool 类型

让读到变量名的人觉得: 这个变量只会有是或不是两种值。

# 是否是超级用户,只会有两种值: 是/不是
is_superuser = True
# 有没有错误,只会有两种值: 有/没有
has_error = False

# 是否允许VIP,只会有两种值: 允许/不允许
allow_vip = True

# 是否使用msgpack,只会有两种值: 使用/不使用
use_msgpack = True

# 是否开启调试模式,被当成bool主要是因为约定俗成,如django配置
DEBUG = True

什么样的名字会被当成数值类型?

  • 释义为数字的所有单词,比如:port(端口号)、age(年龄)、radius(半径)等等。
  • 使用_id结尾的单词,比如: user_id、host_id。
  • 使用length/count开头或结尾的单词,比如:length_of_username、max_length、users_count

注意:不要使用普通的复数来表示一个 int 类型变量,比如 apples、trips,最好使用 number_of_apples,trips_count 来代替。

保持同类变量的一致性

  • 保持同类变量的名称一致
def fetch_image():
    return ""


photo = fetch_image()
image = fetch_image()

疑问:photo 和 image 到底是不是一个东西?

  • 同一个变量名指代的变量类型,也需要保持一致性
cities = "shenzhen, shanghai"


def get_cities():
    return ["shenzhen", "shanghai"]

# BAD
cities = get_cities()

同一个变量不要一会是字符串,一会儿又是列表类型等。

具体再看如何优化变量名

我们来看下面的两段代码:

def get(endpoint, student):
    result = None  # 初始化名称
    # ...


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    class_name = ""  # 初始化名称
    # ... 其它处理
    
    return class_name

第二段函数相比第一段函数进行了以下优化:

  1. 更具体的函数名: get_class_name_by_student_id 更具体、更清晰地描述了函数的作用,可以直观地知道这个函数是根据学生ID获取班级名称。

  2. 明确的参数类型注解: 使用了类型注解,明确指定了 endpoint 参数为字符串类型,student_id 参数为整数类型,并且指定了函数的返回类型为字符串类型。这样可以提高代码的可读性和可维护性,使得调用者更容易理解函数的输入和输出。

  3. 更精准的变量命名: 使用了更具描述性的变量名,例如将 student 改为了 student_id,将 result 改为了 class_name,更清晰地表达了变量的含义,减少了阅读代码时的歧义和混淆。

案例第一次优化:更清晰的变量名

然后我们基于变量名的命名规范对代码进行优化,使代码稍稍可读了一点点。

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 18:51

import json
import urllib.request


def get(endpoint: str, student_id: int) -> str:
    class_name = ""  # 初始化名称
    try:
        student_response = urllib.request.urlopen(f"{endpoint}/student/{student_id}/")  # 获取学生信息
        if student_response.status_code == 200:  # 判断状态码
            student_info = json.loads(student_response.read())  # 解析学生信息
            student_response.close()  # 关闭请求

            class_response = urllib.request.urlopen(f"{endpoint}/class/{student_info['class']}/")  # 请求班级信息
            if class_response.status_code == 200:
                class_info = json.loads(class_response.read())
                class_name = class_info["name"]  # 获取班级名称
                class_response.close()
            else:
                class_response.close()
        else:
            student_response.close()

    except Exception as e:
        return "unknown"

    return class_name

分支:编写分支代码的技巧

编写优秀的条件分支代码非常重要,因为糟糕复杂的分支处理会让人非常困惑,从而降低代码的质量。

避免多层分支嵌套

代码可读性的最大杀手之一:多层嵌套分支

  • if {if {if {} } }:俗称嵌套 if 地狱

多层嵌套优化技巧一:提前结束

# 多层嵌套的代码
def process_data(data):
    if condition1:
        if condition2:
            if condition3:
                return result
    return None

在条件允许的情况下,尽早返回函数以减少嵌套层数。这样可以避免深层嵌套的代码块,使得代码更加扁平化。

# 提前返回
def process_data(data):
    if not condition1:
        return None
    if not condition2:
        return None
    if not condition3:
        return None
    return result

多层嵌套优化技巧二:使用函数分解

# 多层嵌套的代码
def process_data(data):
    for item in data:
        if condition1:
            if condition2:
                # do something
            else:
                # do something else
        else:
            # do another thing

将多层嵌套的代码块分解成单独的函数。这样做可以使得代码结构更清晰,每个函数只负责一个特定的任务。

# 使用函数分解
def process_item(item):
    if condition2:
        # do something
    else:
        # do something else

def process_data(data):
    for item in data:
        if condition1:
            process_item(item)
        else:
            # do another thing

多层嵌套优化技巧二:使用列表推导式和生成器表达式

如果可能,尽量使用列表推导式或生成器表达式来替代多层嵌套的循环。这样可以减少嵌套层数,使得代码更加简洁和易读。

# 多层嵌套的循环
result = []
for i in range(10):
    for j in range(10):
        if i % 2 == 0 and j % 2 == 0:
            result.append((i, j))

# 使用列表推导式
result = [(i, j) for i in range(10) for j in range(10) if i % 2 == 0 and j % 2 == 0]

案例第二次优化:优化 if 分支嵌套

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 18:51

import json
import urllib.request


def get(endpoint: str, student_id: int) -> str:
    try:
        student_response = urllib.request.urlopen(f"{endpoint}/student/{student_id}/")  # 获取学生信息

        if student_response.status_code != 200:  # 判断状态码
            student_response.close()  # 关闭请求
            return "unknown"

        student_info = json.loads(student_response.read())  # 解析学生信息
        student_response.close()

        class_response = urllib.request.urlopen(f"{endpoint}/class/{student_info['class']}/")  # 请求班级信息
        if class_response.status_code != 200:
            class_response.close()
            return "unknown"

        class_info = json.loads(class_response.read())
        class_name = class_info["name"]  # 获取班级名称

        class_response.close()
        return class_name

    except Exception as e:
        return "unknown"

我们使用提前结束的思想优化改写了案例的条件分支。代码可读性是又提高了,不过仍然可以看到有大量的重复代码。比如关闭请求:

重复代码是代码质量的天敌。

我们看到这段代码有 4 个关闭请求的重复代码,而 python 中对于这类资源的处理可以借助上下文管理器优雅的实现。

于是我们接着改造:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 18:51

import json
import urllib.request


def get(endpoint: str, student_id: int) -> str:
    try:
        with urllib.request.urlopen(f"{endpoint}/student/{student_id}/") as student_response:  # 获取学生信息
            if student_response.status_code != 200:  # 判断状态码
                return "unknown"

            student_info = json.loads(student_response.read())  # 解析学生信息

        with urllib.request.urlopen(f"{endpoint}/class/{student_info['class']}/") as class_response:  # 请求班级信息
            if class_response.status_code != 200:
                return "unknown"

            class_info = json.loads(class_response.read())
            class_name = class_info["name"]  # 获取班级名称
            return class_name

    except Exception as e:
        return "unknown"

这样,我们不再需要手动关闭请求了。

但是我们还是会发现:我们的 if 代码有重复!

而这部分优化我们可以通过封装复杂或重复的逻辑判断来实现。

好的封装有以下好处:

  • 封装改善可读性:为过程命名。
  • 封装增加可维护性:消除大量重复代码。

我们接着优化,抽象出响应状态检测:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51

import json
import urllib.request
from http.client import HTTPResponse


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get(endpoint: str, student_id: int) -> str:
    try:
        with urllib.request.urlopen(f"{endpoint}/student/{student_id}/") as student_response:  # 获取学生信息
            raise_for_status(student_response, f"{endpoint}/student/{student_id}/")
            student_info = json.loads(student_response.read())  # 解析学生信息

        with urllib.request.urlopen(f"{endpoint}/class/{student_info['class']}/") as class_response:  # 请求班级信息
            raise_for_status(class_response, f"{endpoint}/class/{student_info['class']}/")

            class_info = json.loads(class_response.read())
            class_name = class_info["name"]  # 获取班级名称
            return class_name

    except Exception as e:
        return "unknown"

然后我们发现仍然有大量重复代码:

我们发现请求的逻辑其实是一样的,因此我们继续封装如下:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51

import json
import urllib.request
from http.client import HTTPResponse


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")

        class_info = request_get(endpoint, f"class/{student_info['class']}/")
        class_name = class_info["name"]  # 获取班级名称
        return class_name

    except Exception as e:
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    with urllib.request.urlopen(f"{endpoint}/{path}") as student_response:
        raise_for_status(student_response, f"{endpoint}/{path}")
        student_info = json.loads(student_response.read())
    return student_info

异常抽象技巧

无处不在的异常

Python 中有许多常见的异常类型,这些异常类型可以帮助开发人员识别和处理程序中的错误。以下是一些常见的 Python 异常类型及其含义:

  1. SyntaxError: 语法错误,通常是由于代码书写不规范导致的错误,比如拼写错误、缺少冒号等。

  2. IndentationError: 缩进错误,通常是由于代码缩进不正确导致的错误。

  3. NameError: 名称错误,通常是由于引用了一个未定义的变量或函数导致的错误。

  4. TypeError: 类型错误,通常是由于操作应用到了不兼容的数据类型上导致的错误,比如对整数和字符串进行加法操作。

  5. ValueError: 值错误,通常是由于传递给函数的参数值不合法导致的错误,比如尝试将字符串转换为整数时字符串格式不正确。

  6. KeyError: 键错误,通常是由于尝试使用字典中不存在的键来访问字典元素导致的错误。

  7. IndexError: 索引错误,通常是由于尝试访问序列中不存在的索引导致的错误,比如尝试访问列表中不存在的元素。

  8. AttributeError: 属性错误,通常是由于尝试访问对象不存在的属性或方法导致的错误。

  9. IOError: 输入/输出错误,通常是由于文件操作或其他输入/输出操作失败导致的错误。

  10. ZeroDivisionError: 零除错误,通常是由于除法操作中除数为零导致的错误。

  11. FileNotFoundError: 文件未找到错误,通常是由于尝试打开或操作不存在的文件导致的错误。

  12. ImportError: 导入错误,通常是由于尝试导入模块或包失败导致的错误。

这些是 Python 中一些常见的异常类型,当程序出现对应的错误时,Python 解释器会抛出相应的异常对象,开发人员可以通过捕获这些异常并处理它们来改进程序的健壮性和可靠性。

异常处理技巧

只做最精确的异常捕获:

  • 永远只捕获哪些可能异常的语句块。
  • 永远只捕获精确的异常类型,而不是模糊的 Exception 。
  • 可忽略的异常捕获之后,试着记个日志。

案例第三次优化:优化异常处理

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51

import json
import urllib.request
from http.client import HTTPResponse
from urllib import error
from loguru import logger


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")
    except (error.URLError, error.ContentTooShortError, error.HTTPError) as e:
        logger.warning(f"Request student info failed: {str(e)}")
        return "unknown"

    try:
        class_info = request_get(endpoint, f"class/{student_info['class']}/")
        class_name = class_info["name"]  # 获取班级名称
        return class_name
    except (error.URLError, error.ContentTooShortError, error.HTTPError) as e:
        logger.warning(f"Request class info failed: {str(e)}")
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    with urllib.request.urlopen(f"{endpoint}/{path}") as student_response:
        raise_for_status(student_response, f"{endpoint}/{path}")
        student_info = json.loads(student_response.read())
    return student_info

这样一改,我们发现又有了大量重复代码:

对于这类异常,我的建议是包装一层,也即是包装到我们自定义的异常中。

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51

import json
import socket
import urllib.request
from http.client import HTTPResponse
from urllib import error
from loguru import logger


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")
    except HTTPError as e:
        logger.warning(f"Request student info failed: {str(e)}")
        return "unknown"

    try:
        class_info = request_get(endpoint, f"class/{student_info['class']}/")
        class_name = class_info["name"]  # 获取班级名称
        return class_name
    except HTTPError as e:
        logger.warning(f"Request class info failed: {str(e)}")
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    try:
        with urllib.request.urlopen(f"{endpoint}/{path}") as student_response:
            raise_for_status(student_response, f"{endpoint}/{path}")
            student_info = json.loads(student_response.read())
        return student_info
    except (error.URLError, error.ContentTooShortError, socket.timeout, error.HTTPError, HTTPError) as e:
        raise HTTPError("Request error", f"{endpoint}/{path}") from e

防御性编程

并不是只能用异常捕获的方式来处理异常,比如使用.get()获取字典指定键的值,避免键不存在的情况:

user_info = {"age": 18}
user_name = user_info.get("name")

防御性编程可以避免很多安全性问题,但是会有对应的性能代价。

比如案例可以设置防御性代码:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51

import json
import socket
import urllib.request
from http.client import HTTPResponse
from urllib import error
from loguru import logger


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")
    except HTTPError as e:
        logger.warning(f"Request student info failed: {str(e)}")
        return "unknown"

    if "class" not in student_info:
        return "unknown"

    try:
        class_info = request_get(endpoint, f"class/{student_info['class']}/")

        return class_info.get("name", "unknown")
    except HTTPError as e:
        logger.warning(f"Request class info failed: {str(e)}")
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    try:
        with urllib.request.urlopen(f"{endpoint}/{path}") as student_response:
            raise_for_status(student_response, f"{endpoint}/{path}")
            student_info = json.loads(student_response.read())
        return student_info
    except (error.URLError, error.ContentTooShortError, socket.timeout, error.HTTPError, HTTPError) as e:
        raise HTTPError("Request error", f"{endpoint}/{path}") from e

对于是否防御性编程,其实是仁者见仁,智者见智。

使用工具保证编码风格

除了借鉴优秀的编程规范和代码实践外,合理运用开源工具也能帮助我们写出高质量 Python 代码。

以下是一些优秀的 Python 代码自动格式化工具:

  1. Black: Black 是一个非常流行的 Python 代码格式化工具,它使用一种称为 “uncompromising code formatter” 的方法来格式化 Python 代码。Black 旨在生成统一且可读性高的 Python 代码,不留下任何注释。

  2. YAPF (Yet Another Python Formatter): YAPF 是由 Google 开发的 Python 代码格式化工具,它也旨在生成一致和可读性高的 Python 代码。YAPF 支持自定义配置,以便根据项目的特定需求进行调整。

  3. autopep8: autopep8 是一个用于自动格式化 Python 代码的工具,它遵循 PEP 8 风格指南,并尝试将代码调整为符合规范的格式。autopep8 还提供了许多选项,以便根据个人偏好进行自定义配置。

  4. pylint: pylint 是一个 Python 代码静态分析工具,它可以检查代码中的错误、风格问题和潜在的 bug,并提供详细的反馈和建议。尽管 pylint 本身并不是一个代码格式化工具,但它可以与其他工具(如 autopep8)结合使用来自动修复检测到的问题。

  5. isort: isort 是一个用于自动排序 Python 导入语句的工具,它可以确保导入语句的顺序符合 PEP 8 规范,并提供了一些额外的选项来调整排序的行为。

对比优化前后的案例代码

我们再来看下案例优化前和优化后的代码:

最初版

#! -*-conding=: UTF-8 -*-
# 2023/11/23 20:21
import json
import urllib.request


def get(endpoint, student):
    result = None  # 初始化名称
    try:
        info1 = urllib.request.urlopen(f"{endpoint}/student/{student}/")  # 获取学生信息
        if info1.status_code == 200:  # 判断状态码
            result1 = json.loads(info1.read())  # 解析学生信息
            info1.close()  # 关闭请求

            result2 = urllib.request.urlopen(f"{endpoint}/class/{result1['class']}/")  # 请求班级信息
            if result2.status_code == 200:
                info2 = json.loads(result2.read())
                result = info2["name"]  # 获取班级名称
                result2.close()
        else:
            info1.close()

    except Exception as e:
        return "unknown"

    return result

终版

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51
import json
import socket
import urllib.request
from http.client import HTTPResponse
from urllib import error
from loguru import logger


class HTTPError(Exception):
    def __init__(self, message, url):
        self.message = message
        self.url = url

    def __str__(self):
        return f"{self.message}: {self.url}"


def raise_for_status(response: HTTPResponse, url: str):
    if response.getcode() != 200:
        raise HTTPError("HTTP error", url)


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")
    except HTTPError as e:
        logger.warning(f"Request student info failed: {str(e)}")
        return "unknown"

    if "class" not in student_info:
        return "unknown"

    try:
        class_info = request_get(endpoint, f"class/{student_info['class']}/")

        return class_info.get("name", "unknown")
    except HTTPError as e:
        logger.warning(f"Request class info failed: {str(e)}")
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    try:
        with urllib.request.urlopen(f"{endpoint}/{path}") as student_response:
            raise_for_status(student_response, f"{endpoint}/{path}")
            student_info = json.loads(student_response.read())
        return student_info
    except (error.URLError, error.ContentTooShortError, socket.timeout, error.HTTPError, HTTPError) as e:
        raise HTTPError("Request error", f"{endpoint}/{path}") from e

进阶小彩蛋

其实很多时候,Python的一些第三方库会帮我们优化很多重复的工作,使我们避免重复造轮子,比如使用 requests 库来优化案例代码:

#!usr/bin/env python
# -*- coding:utf-8 _*-
# __author__:公众号:海哥Python
# __time__:2024/2/22 20:51
import requests
from loguru import logger


def get_class_name_by_student_id(endpoint: str, student_id: int) -> str:
    try:
        student_info = request_get(endpoint, f"student/{student_id}/")
    except requests.HTTPError as e:
        logger.warning(f"Request student info failed: {str(e)}")
        return "unknown"

    if "class" not in student_info:
        return "unknown"

    try:
        class_info = request_get(endpoint, f"class/{student_info['class']}/")
        return class_info.get("name", "unknown")
    except requests.HTTPError as e:
        logger.warning(f"Request class info failed: {str(e)}")
        return "unknown"


def request_get(endpoint, path: str) -> dict:
    response = requests.get(f"{endpoint}/{path}")
    response.raise_for_status()
    return response.json()

在优化后的代码中,我们使用了 requests 库替换了 urllib.request 库,使代码更加简洁和易读。requests 库提供了简洁且功能强大的接口来发送 HTTP 请求,并且处理异常更加方便。

总结

在 Python 编码优化中,应该遵循以下几个方面:

  1. 编码规范: 遵循 PEP 8 编码规范,保持代码的一致性和可读性。使用工具如 Black 、YAPF 等进行自动格式化,确保代码风格统一。

  2. if 分支嵌套优化: 减少 if 分支的嵌套,提高代码的可读性和可维护性。可以通过提前返回错误条件、使用字典或函数映射等方法来简化复杂的条件判断逻辑。

  3. 重复代码封装: 避免重复代码,将重复的逻辑封装成函数或类,提高代码的复用性。同时,避免过度封装,保持函数和类的单一职责。

  4. 异常捕获: 合理处理异常,避免捕获过于宽泛的异常类型,应该尽量具体化异常处理。同时,在必要的地方添加日志记录,方便故障排查和代码调试。

综上所述,通过遵循编码规范、优化 if 分支嵌套、封装重复代码和合理处理异常等方法,可以有效提高 Python 代码的质量和性能。

最后

如果文章对你有帮助,在看、关注走一波呗~

信创迁移实战:在银河麒麟V10-SP1上为Milvus离线部署Docker(附SP1专属避坑指南) 本文详细介绍了在银河麒麟V10-SP1 x86_64环境下离线部署Docker的全流程,特别针对该版本特有的自定义目录安装失败问题提供深度分析和解决方案。通过实战验证的步骤和避坑指南,帮助用户在信创项目中顺利完成Milvus等应用的容器化部署。 阅读详情

相关推荐

VS2103+Intel2013+MSMPI运行Fortran并行程序

VS2103+Intel2013+MSMPI运行Fortran并行程序MSMPI安装新建Fortran90项目编写Fortran并行程序在cmd运行编译完成的执行文件 MSMPI安装 我这里采用的是Microsoft MPI v9.0.1,可以点此下载。下载完成后同时安装msmpisdk.msi、msmpisetup.exe两个文件,安装位置默认即可。 其中msmpisdk.msi的默认安装路径在C:\Program Files (x86)\Microsoft SDKs\MPI,该文件包含了mpi环境所需

weixin_43176703的博客 2936

让 Python 代码更易维护的七种武器

检查你的代码的质量,通过这些外部库使其更易维护。 可读性很重要。 — Python 之禅The Zen of Python,Tim Peters 随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准)。然而,在代码库中保持一致的代码风格和测试标准能够显著减轻维护的压力,也能确保新的开发者能够快速了解项目的情况,同时能更好地全程保持应用程序的...

sxyyu1的博客 332

激光可燃气体传感器DIY指南:从TDLAS原理到STM32实战(附代码)

本文详细介绍了如何DIY激光可燃气体传感器,从TDLAS原理到STM32实战,包括硬件选型、光路搭建、电子系统设计和嵌入式软件开发。通过TDLAS技术实现高灵敏度甲烷检测,适合工业安全和环境监测应用。附有完整代码和实用调试技巧,帮助开发者快速掌握光学气体检测技术。

fanta的博客 440

维护Python代码的5种工具

为什么80%的码农都做不了架构师?>>> ...

weixin_34418883的博客 403

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2414

CS5511芯片实战:如何用DP转LVDS驱动高刷显示器(附配置代码)

本文详细解析了CS5511芯片在DP转LVDS高刷显示器驱动方案中的应用,包括核心架构、寄存器配置、时序优化及典型问题排查。通过实战案例和配置代码,帮助开发者快速实现120Hz高刷新率显示,特别适合医疗影像和工业HMI等严苛场景。

m3n5b7v8c9x的博客 1074

学习 | Pyhton之提升代码可维护性——模块化

学习 | Python之简介&安装&第一个Python程序学习 | Python之数据结构和流程语句学习 | Python之函数——实现代码抽象的利器学习|Python之高级特性:如何写出少而有效的代码学习|Python之高抽象的编程范式(1)—高阶函数学习 | Python之高抽象的编程范式(2)干货 | Python 开发者节省时间的 10 个方法在计算机程序的开发过程中,随着程序代码越写越多

AI深入浅出 2380

SAP生产版本导入避坑大全:从‘黄灯’到‘绿灯’,详解CM_FV_MKAL_CONSISTENCY_CHECK检查函数

本文深入解析SAP生产版本导入过程中的常见问题,特别是通过`CM_FV_MKAL_CONSISTENCY_CHECK`检查函数从‘黄灯’异常到‘绿灯’正常的修复方法。涵盖静态与动态校验机制、典型异常场景诊断及批量导入最佳实践,帮助SAP运维人员高效解决生产版本管理难题。

weixin_30568591的博客 385

详解Python的装饰器, 看这一篇就全懂了!

1 - 简介 当我们执行某一些函数的时候, 可能会在其之前或者之后执行一些操作, 下面是一个常见的例子: import time def test (): n = 0 for i in range (10000): n += i return n t = time.time () test () spend = time.time() - t print ("it took ", spend, "s") 上面这个例子实现了一个计时器, 用来统计函数执.

qq_31269061的博客 305

FFmpeg入门详解之110:RTSP协议讲解

TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。正在上传…重新上传取消RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断(\r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。

福优学苑@音视频+流媒体 2528

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)和电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码和模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 179

如何编写可维护的Python测试代码

本文系统阐述了编写可维护Python测试代码的核心原则与实践技巧。文章首先强调了可维护测试代码在提升团队效率、增强可靠性和节约成本方面的重要性。重点介绍了清晰命名、模块化设计、测试独立性、数据管理等核心原则,并提供了pytest fixtures、参数化测试等具体实现方法。同时指出了硬编码数据、依赖实现细节等常见陷阱及解决方案,通过代码改造案例展示了优化效果。最后指出,遵循这些原则能构建高效测试套件,为敏捷开发和DevOps奠定基础。

2501_94438352的博客 1235

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何编写可维护的代码:最佳实践与技巧

在软件开发中,编写是一个长期的投资。虽然短期内你可能为了赶项目进度编写出功能正常但混乱的代码,但在后续的维护和扩展中,这类代码往往会成为。本篇文章将探讨如何编写的代码,帮助开发者避免不必要的麻烦,提升代码质量。

2401_85044344的博客 1119

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

chatgpt赋能python:Python宏定义:编写高效、灵活和可维护的代码

宏定义是一种编程技巧,可以让您将一个复杂的代码段替换为简单的代码段。它的主要作用是使代码更加简洁、易读和易维护。在Python中,宏定义是通过编写一个函数来实现的。在Python中,要实现宏定义,您需要使用装饰器。Python的装饰器是一种非常强大的技术,可以让您在运行时修改或增强函数或类的行为。在这个示例中,定义了一个名为macro的装饰器。当您在函数上使用@macro语法时,Python会将my_func函数传递给macro函数。

虚幻私塾 445

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python代码编写规范有哪些,Python如何编写代码运行

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、自动化测试带你从零基础系统性的学好Python!👉。

m0_73979992的博客 770

吐槽代码可维护性

吐槽代码可维护性写代码的时候要给维护留条后路,你可能永远不会想到或许有一天一个维护你代码的暴力偏执狂提着斧头找上你家门。不是开玩笑的!我这会正在磨斧头。python语言因为弃掉了大括号,以缩进安排语句块,所以写出来的代码看着整洁、清晰。故从理论上来说,python代码的可维护性应该很好。但是,事在人为。永远不要低估程序员的创造力以及离经叛道,事实上,他们任何事都能做出来。乱七八糟的python代码和

cython22的博客 582

wp-calypso LanguagePicker 组件完全指南:从 Props 到源码实现

LanguagePicker 是 wp-calypso 中用于语言选择的 React 表单组件,其 API 与原生 HTML `input`/`select` 元素高度相似:通过 `value` 属性指定当前值,通过 `onChange` 回调响应值变化。本文以 [client/components/language-picker/README.md](https://link.gitcode.c

gitblog_00108的博客 1057

Chainer代码规范:如何编写高质量、可维护的深度学习代码

深度学习项目开发中,遵循Chainer代码规范是编写高质量、可维护代码的关键。作为基于Python的深度学习框架,Chainer提供了一套完整的代码组织结构和最佳实践指南,帮助开发者构建可靠的机器学习系统。本文将分享7个核心规范技巧,助你提升深度学习代码质量。 ## 📋 模块化设计原则 Chainer代码规范强调模块化设计,将复杂系统拆分为职责清晰的独立组件。核心架构包含以下关键模块: -

gitblog_00076的博客 1075

Python代码编写规范

Python代码编写规范前言:Python之禅:一、代码排版规范二、空格使用规范三、命名规范四、注释规范语法规范六、常见英文缩写 前言: 为了保证代码的易读性,可维护性,稳定性,以及提高脚本的美观度,运行性能,并提前发现一些隐藏的BUG,特制定这一系列通用的规则来统一大家的编写风格,各自业务组可以制定更详细的规则,如模块的划分,引用关系等。 Python之禅: 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简

weixin_42189347的博客 7590

编写高质量 Python 代码:从规范到实战的全面指南

编写高质量的 Python 代码需要结合代码风格、结构设计、性能优化和可维护性。

Innocence_0的博客 1686

python代码库_7个Python库提供更可维护的代码

python代码库 可读性很重要。 — Python的禅宗 ,蒂姆·彼得斯 当软件项目进入“维护模式”时,容易使可读性和编码标准落在旁。 (永远不会首先建立这些标准也很容易。)但是,在整个代码库中保持一致的样式和测试标准是减轻维护负担的重要组成部分,以确保未来的开发人员能够快速掌握新产品中发生的事情,主题项目并随着时间的推移保护应用程序的健康。 linting代码 (检查PEP 8和其他...

cumj63710的博客 2332

pbpython最佳实践:编写可维护商业Python代码的7个黄金法则

在商业数据分析领域,编写可维护的Python代码不仅能提升团队协作效率,还能确保业务逻辑的准确性和可扩展性。**pbpython**作为专注于实用商业Python技巧的开源项目,提供了大量从实际业务场景中提炼的代码范例。本文将结合项目中的最佳实践,分享7个编写可维护商业Python代码的核心原则,帮助开发者在处理Excel数据、生成业务报告和构建交互式分析工具时写出更专业、更易维护的代码。 ##

gitblog_00820的博客 428

python代码评测_用Python编写干净 可测试 高质量的代码

【IT168 技术】简介编写软件是人所承担的最复杂的任务之一。AWK 编程语言和 "K and R C" 的作者之一 Brian Kernigan 在 Software Tools 一书中总结了软件开发的真实性质,他说,“控制复杂性是软件开发的根本。” 真实软件开发的残酷现实是,软件常常具有有意或无意造成的复杂性,而且开发人员常常漠视可维护性、可测试性和质量。这种不幸局面的最终结果是软件的维护变得...

weixin_39953102的博客 145
上一篇: Python中的functools模块详解
下一篇: 【Redis】搞懂过期删除策略和内存淘汰策略
海哥python
博客等级 码龄9年 1487粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值