在Python中重试一个循环
while
或for
循环对于重复代码块来说是很好的,当我们需要对一个动作进行已知或未知次数的尝试时,我们经常使用它们。然而,在有些情况下,我们可能需要重试一个单一的循环,因为它应该尝试的动作没有发生或返回错误。
像这样的情况发生在随机的,或者最特别的,网络/请求的行动中。通常情况下,这些动作可以工作,但可能经常失败,而这正是retry
装饰器的用处。
本文将讨论我们将如何处理这种情况,并在Python中重试一个循环。
在Python中使用@retry
来重试一个循环动作
我们可以使用tenacity
库retry
decorator 来重试一个循环动作,你可以在 Pythonretry
decorators 指南中了解更多信息。
要安装tenacity
库,我们可以使用pip
命令:
pip install tenacity
为了展示一个案例场景,我们将根据给定的开始和结束参数(将由用户定义)制作一个随机生成数字的函数。然而,这个generateRandomly
,只有当它小于或等于二十(20)时,才会返回一个数字。
如果数字高于20,它会引发一个ValueError
。
import random
userStartInput = int(input("Enter Start Number: "))
userEndInput = int(input("Enter End Number: "))
def generateRandomly(start, end):
generateNum = random.randint(start, end)
if generateNum > 20:
print("Tried")
raise ValueError("Number generated isn't within range")
else:
return generateNum
for i in range(0, 20):
print(generateRandomly(userStartInput, userEndInput))
代码的输出:
Enter Start Number: 12
Enter End Number: 50
Tried
Traceback (most recent call last):
File "C:UsersakinlDocumentsPythonSFTPtest.py", line 17, in <module>
print(generateRandomly(userStartInput, userEndInput))
File "C:UsersakinlDocumentsPythonSFTPtest.py", line 11, in generateRandomly
raise ValueError("Number generated isn't within range")
ValueError: Number generated isn't within range
用户的输入是12和50,第一个随机数字高于20;因此,它引发了一个ValueError
。然而,使用tenacity
提供的retry
装饰器,我们可以重试同一个循环,直到它给我们一个小于或等于20的数字。
import random
from tenacity import retry
userStartInput = int(input("Enter Start Number: "))
userEndInput = int(input("Enter End Number: "))
@retry
def generateRandomly(start, end):
generateNum = random.randint(start, end)
if generateNum > 20:
print("Tried")
raise ValueError("Number generated isn't within range")
else:
return generateNum
for i in range(0, 20):
print(generateRandomly(userStartInput, userEndInput))
代码的输出:
Tried
Tried
Tried
13
Tried
15
Tried
Tried
Tried
Tried
Tried
Tried
Tried
Tried
15
Tried
Tried
Tried
Tried
Tried
16
20
18
Tried
16
Tried
Tried
Tried
18
19
Tried
Tried
Tried
14
Tried
20
Tried
Tried
Tried
19
Tried
Tried
Tried
15
13
14
Tried
12
Tried
Tried
Tried
Tried
Tried
Tried
20
Tried
15
19
Tried
20
我们引入了print("Tried")
,以显示在给出一个小于或等于20的数字之前重试了多少次generateRandomly
函数。如果没有Tried
,输出看起来更像这样。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。