栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python每日习题:自己封装失败重跑装饰器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python每日习题:自己封装失败重跑装饰器

写的时候很快 但是当我重新看题目的时候 突然发现题目中的关键字 可以用来装饰任何一个功能函数 突然发现 我直接用 a b形参了。于是又重新整理了一下思路

写的飞快 但是执行的时候 发现了这种思路并不可行 从debug中 我们可以看到 实参中10 直接作为count被传了 导致再if条件判断下并没有执行这行代码。

于是又换了一种思路 count的值 作为装饰器参数传递

本来一开始想的是 装饰器传递参数 然后去更改装饰器的值 判断失败重跑 但是抛了一个语法错误。嵌套函数里面仿佛是无法更改外层的函数值内容。 这里有厉害的宝子 可以一起沟通哦~已经涉及到小余的知识盲区了

最后改来改去 改成了下面的方法实现

def test_assert(func):
 def swapper(*args, **kwargs):
 # 执行函数 判断如果函数执行失败 return AssertionError 
 def start_func(*args, **kwargs):
 try:
 func(*args, **kwargs)
 except AssertionError:
 return AssertionError 
 count 0
 # 调用函数
 res start_func(*args, **kwargs)
 # 判断当函数出现异常并且异常次数小于 3 次
 if res AssertionError :
 if count 3:
 for i in range(3):
 print( 断言失败 开始尝试失败重跑 当前尝试第{}次重跑 .format(i))
 # 失败重跑
 a start_func(*args, **kwargs)
 count 1
 # 当用例执行通过 则直接退出
 if a ! AssertionError :
 break
 else:
 pass
 return swapper

但是写完之后 我总觉得功能虽然实现了 但是整体的写法上面 并不是我想要的效果 那么我们来看看终极版

def decorator(func):
 def wrapper(*args, **kwargs):
 for i in range(4):
 try:
 res func(*args, **kwargs)
 except AssertionError as e:
 # 判断当用例执行到第三次的时候 抛异常
 if i 3:
 raise e
 else:
 # 执行通过 直接返回函数内容
 return res
 return wrapper
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号