欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python重試裝飾器的簡單實(shí)現(xiàn)方法

 更新時(shí)間:2019年01月31日 09:37:47   作者:BlackMatrix  
今天小編就為大家分享一篇python重試裝飾器的簡單實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

簡單實(shí)現(xiàn)了一個(gè)在函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的裝飾器,支持控制最多重試次數(shù),每次重試間隔,每次重試間隔時(shí)間遞增。

最新的代碼可以訪問從github上獲取

https://github.com/blackmatrix7/matrix-toolkit/blob/master/toolkit/retry.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/8/18 上午9:50
# @Author : Matrix
# @Github : https://github.com/blackmatrix7/
# @Blog : http://www.cnblogs.com/blackmatrix/
# @File : retry.py
# @Software: PyCharm
import time
from functools import wraps

__author__ = 'blackmatrix'


"""
在函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的簡單裝飾器
"""


class StopRetry(Exception):

 def __repr__(self):
  return 'retry stop'


def retry(max_retries: int =5, delay: (int, float) =0, step: (int, float) =0,
   exceptions: (BaseException, tuple, list) =BaseException,
   sleep=time.sleep, callback=None, validate=None):
 """
 函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的簡單裝飾器。
 :param max_retries: 最多重試次數(shù)。
 :param delay: 每次重試的延遲,單位秒。
 :param step: 每次重試后延遲遞增,單位秒。
 :param exceptions: 觸發(fā)重試的異常類型,單個(gè)異常直接傳入異常類型,多個(gè)異常以tuple或list傳入。
 :param sleep: 實(shí)現(xiàn)延遲的方法,默認(rèn)為time.sleep。
 在一些異步框架,如tornado中,使用time.sleep會(huì)導(dǎo)致阻塞,可以傳入自定義的方法來實(shí)現(xiàn)延遲。
 自定義方法函數(shù)簽名應(yīng)與time.sleep相同,接收一個(gè)參數(shù),為延遲執(zhí)行的時(shí)間。
 :param callback: 回調(diào)函數(shù),函數(shù)簽名應(yīng)接收一個(gè)參數(shù),每次出現(xiàn)異常時(shí),會(huì)將異常對(duì)象傳入。
 可用于記錄異常日志,中斷重試等。
 如回調(diào)函數(shù)正常執(zhí)行,并返回True,則表示告知重試裝飾器異常已經(jīng)處理,重試裝飾器終止重試,并且不會(huì)拋出任何異常。
 如回調(diào)函數(shù)正常執(zhí)行,沒有返回值或返回除True以外的結(jié)果,則繼續(xù)重試。
 如回調(diào)函數(shù)拋出異常,則終止重試,并將回調(diào)函數(shù)的異常拋出。
 :param validate: 驗(yàn)證函數(shù),用于驗(yàn)證執(zhí)行結(jié)果,并確認(rèn)是否繼續(xù)重試。
 函數(shù)簽名應(yīng)接收一個(gè)參數(shù),每次被裝飾的函數(shù)完成且未拋出任何異常時(shí),調(diào)用驗(yàn)證函數(shù),將執(zhí)行的結(jié)果傳入。
 如驗(yàn)證函數(shù)正常執(zhí)行,且返回False,則繼續(xù)重試,即使被裝飾的函數(shù)完成且未拋出任何異常。
 如回調(diào)函數(shù)正常執(zhí)行,沒有返回值或返回除False以外的結(jié)果,則終止重試,并將函數(shù)執(zhí)行結(jié)果返回。
 如驗(yàn)證函數(shù)拋出異常,且異常屬于被重試裝飾器捕獲的類型,則繼續(xù)重試。
 如驗(yàn)證函數(shù)拋出異常,且異常不屬于被重試裝飾器捕獲的類型,則將驗(yàn)證函數(shù)的異常拋出。
 :return: 被裝飾函數(shù)的執(zhí)行結(jié)果。
 """
 def wrapper(func):
  @wraps(func)
  def _wrapper(*args, **kwargs):
   nonlocal delay, step, max_retries
   func_ex = StopRetry
   while max_retries > 0:
    try:
     result = func(*args, **kwargs)
     # 驗(yàn)證函數(shù)返回False時(shí),表示告知裝飾器驗(yàn)證不通過,繼續(xù)重試
     if callable(validate) and validate(result) is False:
      continue
     else:
      return result
    except exceptions as ex:
     # 回調(diào)函數(shù)返回True時(shí),表示告知裝飾器異常已經(jīng)處理,終止重試
     if callable(callback) and callback(ex) is True:
      return
     func_ex = ex
    finally:
     max_retries -= 1
     if delay > 0 or step > 0:
      sleep(delay)
      delay += step
   else:
    raise func_ex
  return _wrapper
 return wrapper


if __name__ == '__main__':
 pass

以上這篇python重試裝飾器的簡單實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池

    Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池

    這篇文章主要介紹了Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池,Python 連接 PostgreSQL 是主要有兩個(gè)包, py-postgresql 和 psycopg2 , 而本文的實(shí)例將使用后者,感興趣的小伙伴可以參考一下
    2021-10-10
  • Python獲取運(yùn)行目錄與當(dāng)前腳本目錄的方法

    Python獲取運(yùn)行目錄與當(dāng)前腳本目錄的方法

    這篇文章主要介紹了Python獲取運(yùn)行目錄與當(dāng)前腳本目錄的方法,涉及Python目錄操作與系統(tǒng)相關(guān)變量的獲取技巧,需要的朋友可以參考下
    2015-06-06
  • Python7個(gè)爬蟲小案例詳解(附源碼)上篇

    Python7個(gè)爬蟲小案例詳解(附源碼)上篇

    這篇文章主要介紹了Python7個(gè)爬蟲小案例詳解(附源碼)上篇,本文章內(nèi)容詳細(xì),通過案例可以更好的理解爬蟲的相關(guān)知識(shí),七個(gè)例子分為了三部分,本次為上篇,共有二道題,需要的朋友可以參考下
    2023-01-01
  • django 外鍵model的互相讀取方法

    django 外鍵model的互相讀取方法

    今天小編就為大家分享一篇django 外鍵model的互相讀取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python+OpenCV 實(shí)現(xiàn)簡單的高斯濾波(推薦)

    Python+OpenCV 實(shí)現(xiàn)簡單的高斯濾波(推薦)

    這篇文章主要介紹了Python+OpenCV 實(shí)現(xiàn)簡單的高斯濾波,在文中需要注意的是,這里我沒有特判當(dāng)sigma = 0的時(shí)候的情況,具體實(shí)現(xiàn)過程跟隨小編一起看看吧
    2021-09-09
  • opencv改變imshow窗口大小,窗口位置的方法

    opencv改變imshow窗口大小,窗口位置的方法

    下面小編就為大家分享一篇opencv改變imshow窗口大小,窗口位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python實(shí)現(xiàn)繪制多種激活函數(shù)曲線詳解

    Python實(shí)現(xiàn)繪制多種激活函數(shù)曲線詳解

    所謂激活函數(shù)(Activation?Function),就是在人工神經(jīng)網(wǎng)絡(luò)的神經(jīng)元上運(yùn)行的函數(shù),負(fù)責(zé)將神經(jīng)元的輸入映射到輸出端。這篇文章主要介紹了Python如何實(shí)現(xiàn)繪制多種激活函數(shù)曲線,希望對(duì)大家有所幫助
    2023-04-04
  • NumPy迭代數(shù)組的實(shí)現(xiàn)

    NumPy迭代數(shù)組的實(shí)現(xiàn)

    本文主要介紹了NumPy迭代數(shù)組的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python openpyxl打開文件關(guān)閉問題

    python openpyxl打開文件關(guān)閉問題

    這篇文章主要介紹了python openpyxl打開文件關(guān)閉問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python的dict,set,list,tuple應(yīng)用詳解

    python的dict,set,list,tuple應(yīng)用詳解

    這篇文章主要介紹了python的dict,set,list,tuple應(yīng)用詳解,需要的朋友可以參考下
    2014-07-07

最新評(píng)論