写的时候很快 但是当我重新看题目的时候 突然发现题目中的关键字 可以用来装饰任何一个功能函数 突然发现 我直接用 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



