688 字
3 分钟
Python 2个好用的装饰器函数
背景
装饰器:Python开发者的效率利器! 🛠️
在Python的世界里,装饰器绝对是一把强大的“瑞士军刀”。它能帮我们优雅地封装通用逻辑,大幅减少重复代码,真正实现事半功倍的开发效率。
如果你是第一次接触装饰器这个概念,强烈建议先找些基础资料了解一下它的核心思想和工作原理(别担心,小编当初也是一头雾水,看别人的代码完全摸不着头脑)。打好基础再往下看,理解起来会顺畅得多,相信小编!
小编环境
import sys
print('python 版本:',sys.version.split('|')[0])#python 版本: 3.11.11计算耗时
想知道函数执行耗时?一个装饰器轻松搞定!⏱️
还在手动写 time.time() 包裹你的函数来计算耗时吗?太麻烦啦!只需几行代码定义一个计时装饰器,轻轻松松给任何函数“戴上”,就能自动获取精准的执行时间
def time_it(func): @wraps(func) # 保留原始函数的元数据 def wrapper(*args, **kwargs): print("开始执行---->") start_time=datetime.datetime.now() result = func(*args, **kwargs) end_time=datetime.datetime.now() print(f"结束执行,消耗时长为:{end_time - start_time}") return result return wrapper重试机制
在程序中调用外部API、访问数据库或进行网络请求时,网络环境的不稳定性往往是导致程序“意外扑街”的头号元凶!面对这种不可控因素,与其祈祷网络永远畅通,不如主动出击——引入重试机制,来增加程序的健壮性
def retry(func=None,*,times=3): if func is None: return partial(retry,times=times)
@wraps(func) def wrapper(*args,**kwargs): for attempt in range(1,times+1): try: return func(*args,**kwargs) except Exception as exc: print(f"函数 {func.__name__} 进行第 {attempt} 次尝试,遇到错误:{exc}") sleep(SLEEP_TIME * attempt) print(f"所有尝试均失败!!!") return None
return wrapper完整代码
from time import sleepimport datetimefrom functools import wraps,partial # 导入 wraps 装饰器
SLEEP_TIME=1
def time_it(func): @wraps(func) # 保留原始函数的元数据 def wrapper(*args, **kwargs): print("开始执行---->") start_time=datetime.datetime.now() result = func(*args, **kwargs) end_time=datetime.datetime.now() print(f"结束执行,消耗时长为:{end_time - start_time}") return result return wrapper
def retry(func=None,*,times=3): if func is None: return partial(retry,times=times)
@wraps(func) def wrapper(*args,**kwargs): for attempt in range(1,times+1): try: return func(*args,**kwargs) except Exception as exc: print(f"函数 {func.__name__} 进行第 {attempt} 次尝试,遇到错误:{exc}") sleep(SLEEP_TIME * attempt) print(f"所有尝试均失败!!!") return None
return wrapper
if __name__=='__main__':
@retry @time_it def cal(x): total=0 for i in range(x): total += i
return total
print(cal(100000000)) print(cal('100000'))运行测试结果

历史相关文章
以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货