在Python中重试一个循环

whilefor 循环对于重复代码块来说是很好的,当我们需要对一个动作进行已知或未知次数的尝试时,我们经常使用它们。然而,在有些情况下,我们可能需要重试一个单一的循环,因为它应该尝试的动作没有发生或返回错误。

像这样的情况发生在随机的,或者最特别的,网络/请求的行动中。通常情况下,这些动作可以工作,但可能经常失败,而这正是retry 装饰器的用处。

本文将讨论我们将如何处理这种情况,并在Python中重试一个循环。

在Python中使用@retry 来重试一个循环动作

我们可以使用tenacityretry 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 ,输出看起来更像这样。