python - 大多数 pythonic 方式尝试,除了,并重试一次

标签 python

我正在寻找尝试命令的最 pythonic 方式,如果发生错误则捕获并通过运行预备命令然后运行原始命令重试。特别是在我的例子中,我希望将一个表写入数据库,如果抛出“模式不存在”错误则捕获,然后尝试创建一个模式并重试写入表。然后,如果写表再次出错,我不想捕获它。

到目前为止,我已经(示意性地):

try:
    write_to_table(table, schema)
except sqlalchemy.exc.ProgrammingError:
    create_schema(schema)
    write_to_table(table, schema)

这是我想要的,但似乎有点不对劲,可能是因为我在复制 write_to_table()。

那么,执行上述操作最符合 Python 风格的方法是什么?

附言当我说我想重试时,我不想这样:How to retry after exception?

最佳答案

只需创建一个可重用的装饰器!!

def retry(func):
        '''
        Decorator.
        If the decorated function fails with an exception 
        calls it again after a random interval.
        '''
        def _retry(*args,**kwargs):
            max_retries = 1
            for i in range(max_retries):
                try:
                    value = func(*args,**kwargs)
                    return value
                except sqlalchemy.exc.ProgrammingError as e:
                    print('function:[{}({},{})] Failed with error: {} . Retrying...'.format(func.__name__,str(*args),str(kwargs),str(e)))
                    time.sleep(random.uniform(1,3))
            print("Max_retries({}) exceeded for function {}".format(max_retries,func.__name__))
        return _retry

通过使用上述装饰器,您还可以在其中配置重试次数和重试间隔,您可以执行以下操作:

@retry
write_to_table(table, schema)

关于python - 大多数 pythonic 方式尝试,除了,并重试一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815588/

相关文章:

python - sympy : resolving Euler's Identity 中的复数

python - Anaconda 导航器仅显示一个 Python 版本

python - 如何创建一个根据多种条件增加的ID?

android - 如何在 Debian 上连接 pybluez RFCOMM 服务器套接字?

python - 获取某些列中每个值出现的百分比

python - Pandas 数据框分组

python - 使用 Python 从 selenium hub 测试自签名域

python - lxml - 如何获取 HtmlElement 的 xpath?

python - 使用 csv 阅读器后无法使用

python - blender 选择所选面循环内的所有面