如何将@retry与关键字参数一起使用并传递函数

时间:2015-02-22 03:46:14

标签: python decorator python-decorators

我正在使用重试(pip install retrying)包。

我有这样的功能 -

from retrying import retry
from random import randint

def a():
    number = randint(0, 10)

    if number > 0:
        print number
        raise Exception("Some exception")
    else:
        return number

# Case 1
a = retry(a)  # This works as expected - i.e. execs until I get a 0
print a()

# Case 2
a = retry(a, stop_max_attempt_number=3)
print a()

在案例2中,stop_max_attempt_number没有效果。是否有不同的方式传递函数, AND 关键字arg?

我的用例是我想要只在需要时装饰一个函数,所以在@retry(stop_max_attempt_number=3)之前放置def a()的典型用法并不是我需要的。

1 个答案:

答案 0 :(得分:2)

retry是一个装饰器,可以不带参数使用,也可以使用。如果您给它参数,它将作为装饰器工厂并返回实际的装饰器。调用返回的装饰器:

a = retry(stop_max_attempt_number=3)(a)

因为这相当于使用retry()作为装饰器:

@retry(stop_max_attempt_number=3)
def a():
    # ...