在函数内部使用装饰器

psa*_*era 6 python python-decorators

在函数内部,我使用了类似的重试机制(总是在 try/except 块中):

        def load(self):
            [........]
            # Retry mechanism for locking database 
            for i in range(1, max_connection_retries+1):                        
                try:
                    cu.lock()
                    break
                except LockError as l_error:
                    if i < max_connection_retries:
                        sleep(20)
                        continue
                    else:
                        raise ContinuableError (logger.console(datetime.now().time().strftime ("%b %d %H:%M:%S") + ' ERROR:Impossible to lock the database after %i retries' % max_connection_retries))
        [.......]
Run Code Online (Sandbox Code Playgroud)

我在同一功能的其他部分和其他功能中多次使用这种机制。可以将装饰器仅应用于代码的这一部分吗?类似的东西:

        def load(self): 
            [.......]
            @retry(max=5,message='blablabla')                       
            try:
                cu.lock()
                break
            except LockError as l_error:

            [.......]

            @retry(max=5)                       
            try:
                cu.unlock()
                break
            except LockError as l_error:
Run Code Online (Sandbox Code Playgroud)

如果是这样,你能帮我展示一个装饰器的例子来完成这样的任务吗?

che*_*ner 5

装饰器语法只是语法糖

# f could be a class as well
def f():
    ...
f = retry(f)
Run Code Online (Sandbox Code Playgroud)

它不能应用于任意匿名代码块。装饰器的主要目的是重新绑定名称,而根据定义,匿名块没有名称。

您需要做的是将要重试的代码重构为被修饰的函数。例如,

@retry(max=5, message='blablabla')
def get_lock():
    try:
        cu.lock()
    except LockError as l_error:
        # Some action dependent on the implementation of retry


def load(self):
    get_lock()
Run Code Online (Sandbox Code Playgroud)