(摸鱼烤肉)5个能让代码减半的Python装饰器

news/2024/4/21 1:45:39/

什么是装饰器

包装器,英文wrapper,一种函数,能够作用于别的函数从而给被作用的函数添加新功能,或是修改其行为。包装器通常以装饰器(英文是decorator)的形式实现,装饰器将另一个函数作为输入,并对功能做一些改进。

包装器可以被应用于很多场景:

  • 功能扩展:添加一些特征(features),比如打印日志(logging),评估性能或者缓存。
  • 代码复用:包装器无疑可以被应用到很多地方,既能防止代码重复,又能确保跨组件的一致行为。
  • 行为修改:我们可以解释输入参数,比如,在不需要写很多assert语句的前提下避免许多输入变量。

例子🍒来了

下面的例子会说服你相信装饰器是日常工作中不可或缺的。

1 - Timer

timer能够用来计算和打印一个函数的执行时间。

import timedef timer(func):def wrapper(*args, **kwargs):# start the timerstart_time = time.time()# call the decorated functionresult = func(*args, **kwargs)# remeasure the timeend_time = time.time()# compute the elapsed time and print itexecution_time = end_time - start_timeprint(f"Execution time: {execution_time} seconds")# return the result of the decorated function executionreturn result# return reference to the wrapper functionreturn wrapper

定义了一个名为timer的函数,timer接收func为参数,证明其是一个装饰器函数。在timer的内部,定一个名为wrapper的函数,想要传给被装饰函数的参数由wrapper来接收。

在wrapper内部,用提供的参数调用被装饰函数,即

result = func(*args, **kwargs)

最终,wrapper返回了被装饰函数的执行。装饰器函数(timer)应当返回wrapper的索引。

我们选一个被装饰函数来用一下装饰器

@timer
def train_model():print("Starting the model training function...")# simulate a function execution by pausing the program for 5 secondstime.sleep(5) print("Model training completed!")train_model() 

输出为

Starting the model training function...
Model training completed!
Execution time: 5.0018792152404785 seconds

2 - Debugger

未完待续

3 - Retry

如果你的函数涉及到网络的处理或API的调用,那么装饰器retry将非常有用。retry可以让一个函数重复执行固定的次数,同时能设置次数之间的延迟。

import timedef retry(max_attempts, delay=1):def decorator(func):def wrapper(*args, **kwargs):attempts = 0while attempts < max_attempts:try:return func(*args, **kwargs)except Exception as e:attempts += 1print(f"Attempt {attempts} failed: {e}")time.sleep(delay)print(f"Function failed after {max_attempts} attempts")return wrapperreturn decorator

 用法

@retry(max_attempts=3, delay=2)
def fetch_data(url):print("Fetching the data..")# raise timeout error to simulate a server not responding..raise TimeoutError("Server is not responding.")
fetch_data("https://example.com/data")  # Retries 3 times with a 2-second delay between attempts

输出

Fetching the data..
Attempt 1 failed: Server is not responding.
Fetching the data..
Attempt 2 failed: Server is not responding.
Fetching the data..
Attempt 3 failed: Server is not responding.
Function failed after 3 attempts 

原文链接

Five Python Decorators That Can Reduce Your Code By Half


http://www.ppmy.cn/news/1049908.html

相关文章

数据结构(1)

数据结构其实就是将数据按照一定的关系组织起来的集合&#xff0c;用于组织和存储数据。 1.数据结构分类 1.逻辑结构 逻辑结构是从具体问题中抽象出来的模型&#xff0c;是抽象意义的结构&#xff0c;按照对象中数据的相互关系进行分类。 1>集合结构&#xff1a;集合结构中…

SpringBootWeb案例 Part 2

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询 带条件的分页查询 删除员工 新增员工 修改员工 那下面我们就先从分页查询功能开始学习。 3.…

【Linux】cpolar+JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

cloud_mall-notes02

1、多条件分页查询page ApiOperation("多条件分页查询xxxx")GetMapping("page")PreAuthorize("hasAuthority(模块权限:权限:page)")public ResponseEntity<Page<实体类>> loadxxxxPage(Page<实体类> page,实体类 domain) {pag…

机器学习之数据清洗

一、介绍 数据清洗是机器学习中的一个重要步骤&#xff0c;它涉及对原始数据进行预处理和修复&#xff0c;以使数据适用于机器学习算法的训练和分析。数据清洗的目标是处理数据中的噪声、缺失值、异常值和不一致性等问题&#xff0c;以提高数据的质量和准确性。 二、方法 处理…

基于JJWT理解JWT,JWS,JWE

JWT &#xff0c; 全写JSON Web Token, 是开放的行业标准RFC7591&#xff0c;用来实现端到端安全验证. 从开发者理解的角度来说&#xff1a; JWT 是一个定义传递信息的标准JWT 的Token是一个Base64编码的字符串&#xff0c; 类似 eyJhbGciOiJIUzI1NyJ9.eyJzdWIiOiJvc2NhciJ9.…

Kubernetes(K8s)从入门到精通系列之十六:linux服务器安装minikube的详细步骤

Kubernetes K8s从入门到精通系列之十六:linux服务器安装minikube的详细步骤 一、安装Docker二、创建启动minikube用户三、下载minikube四、安装minikube五、将minikube命令添加到环境变量六、启动minikube七、查看pods,自动安装kubectl八、重命名minikube kubectl --为kubect…

vscode如何关闭受限模式

受限模式旨在实现安全地浏览代码 第一步&#xff1a; 第二步&#xff1a;输入trust,找到Security.workspace.trust,取消勾选 第三步&#xff1a; 重启vscode.

Screen终端管理工具

文章目录 Screen终端管理工具背景nohup介绍screen介绍安装screen查看终端新建终端退出终端进入终端删除会话帮助命令 总结 Screen终端管理工具 背景 对大佬只有膜拜&#xff0c;可能永远无法超越&#xff0c;在工作交接中大佬用到了一个screen启动了程序&#xff0c;这是什么…

微信小程序用户流失率高怎么办?

小程序有着非常丰富的入口场景&#xff0c;用户可以通过多种入口进入小程序&#xff0c;所以小程序推广拉新的成本也是比较低的。 当小程序上线后&#xff0c;除了面临推广的问题&#xff0c;小程序“用完即走”的特殊属性&#xff0c;如何把用户留住以及如何挽回流失的用户&a…

30 | 聚类分析

聚类分析 聚类是数据挖掘和计算的基本任务,是将大量数据集中具有“相似”特征的数据点或者样本划分为一个类别。其基本思想是“物以类聚,人以群分”,因此大量的数据集中必然存在相似的数据样本,基于这个思想将数据区分开来,并发现不同类的特征。 聚类常用语数据探索或挖…

Android资深工程书之LiveData核心组件原理剖析

LiveData是Android架构组件库中的一个类&#xff0c;用于在应用程序组件之间共享数据。它是一种可观察的数据持有者&#xff0c;可以感知应用程序组件的生命周期&#xff0c;并在数据发生变化时通知观察者。 使用LiveData 在Android应用程序中使用LiveData&#xff0c;你可以…

【Linux】Linux下常用搜索命令及其常用选项小结

0x00 前言 版本信息&#xff1a;Ubuntu 18.04.6 LTS 最后更新日期&#xff1a;2023.8.18 0x01 Linux下常用搜索命令及其常用选项小结 1.find &#xff08;1&#xff09;find path -name filename &#xff1a;在指定目录path查找名为filename 文件&#xff0c;文件名可用*匹…

每日一学——案例难点Windows配置

在Windows上配置DNS服务器有几个步骤&#xff1a; 步骤1&#xff1a;打开网络连接设置 在任务栏上右键单击网络图标&#xff0c;并选择“打开网络和Internet设置”。 在新窗口中&#xff0c;选择“更改适配器选项”。 在打开的窗口中&#xff0c;找到正在使用的网络适配器&a…

Ohio主题 - 创意组合和代理机构WordPress主题

Ohio主题是一个精心制作的多用途、简约、华丽、多功能的组合和创意展示主题&#xff0c;具有敏锐的用户体验&#xff0c;您需要构建一个现代且实用的网站&#xff0c;并开始销售您的产品和服务。它配备了最流行的WordPress页面构建器 WPBakery Page Builder&#xff08;以前称为…

学习设计模式之观察者模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 观察者模式 观察者模式定义了一种一对多的依赖关系&#xff0c;一个对象的状态改变&#xff0c;其他所有依赖者都会接收相应的通知。 所…

wustojc日期格式变化

#include <stdio.h> int main() {char a[10];for(int i0;i<10;i){//用一个耍聪明的方法&#xff0c;全部用数组存储&#xff1b;面向结果编程a[0]getchar();}printf("%c%c%c%c%c%c%c%c%c%c",a[6],a[7],a[8],a[9],a[2],a[0],a[1],a[5],a[3],a[4]);return 0;}…

暑期高铁站大量遗失物品,FindMy帮助寻找

近日&#xff0c;一女子在上海坐高铁时&#xff0c;将户口本、房产证遗落安检处的新闻引起网友的关注。然后业内人士表示&#xff1a;常事&#xff0c;车站什么都能捡到。 据中国铁路透露&#xff0c;暑运期间&#xff0c;上海虹桥站客流增加&#xff0c;日均发送旅客20多万人…

unity开发笔记#230821-手搓一个虚拟摇杆

做unity游戏时&#xff0c;如果是做手机端则需要加一个虚拟摇杆以便玩家控制角色移动&#xff08;做pc端则直接获取键值即可较方便&#xff09;。原理就是用Image制作一个大圆圈住一个Image小圆&#xff0c;玩家拖拽小圆控制角色移动。中心思想是&#xff0c;以小圆中心为(0,0)…

C++笔记之std::move和右值引用的关系、以及移动语义

C笔记之std::move和右值引用的关系、以及移动语义 code review! 文章目录 C笔记之std::move和右值引用的关系、以及移动语义1.一个使用std::move的最简单C例子2.std::move 和 T&& reference_name expression;对比3.右值引用和常规引用的经典对比——移动语义和拷贝语…