偶然看到一篇文章,想到了前幾天的乙個需求,git pull
效能不穩,需要加入重試機制,正好這個裝飾器的例項符合這樣的場景。
# coding:utf-8
import time
import logging
import socket
from functools import wraps
logging.basicconfig(level=logging.debug)
def retry(retries=3, delay=1):
@wraps(func)
def proxy(*args, **kwargs):
count = retries
error = none
while count > 0:
try:
return func(*args, **kwargs)
except exception as e:
print("relay times: {}".format(count))
count -= 1
time.sleep(delay)
error = e
return error
return proxy
@retry(2, 3)
def check():
sk = socket.socket()
sk.settimeout(5)
sk.connect(('x.x.x.x', 80))
'''# 上面寫法屬於簡寫方式,等價於下面的處理
maketry=retry(2,3)
@maketry
def check():
pass
'''if __name__ == "__main__":
check()
print(check.__name__)
參考: Python裝飾器(例項演練)
原理 裝飾器說到底就是閉包的多層運用,內部呼叫外層函式的區域性變數返回給外部函式再在全域性呼叫結果。原則 1.封閉開放原則。2.把寫的基礎函式 別人或者各個模組呼叫 封閉起來不做更改。3.需要增加功能時,可以拓展。語法 加上 符 系統會自動把下面的函式當成引數傳到裝飾器中,從下到上。功能舉例 假如我...
python裝飾器及簡單例項
裝飾器 加入購物車,付款,修改收穫位址 判斷使用者登入狀態 def func number a 100 def inner func nonlocal a nonlocal number number 1 for i in range number a 1 print 修改後的a的值 a retur...
Python之裝飾器的例項
1.1裝飾器的應用 引數型別檢查 函式引數的檢查,一定是在函式外 函式應該作為引數,傳入到檢查函式中 檢查函式拿到函式傳入的實際引數,與形參宣告對比 annotations 屬性是乙個字典,其中包括返回值型別的宣告。假設要做位置引數的判斷,無法和字典中的宣告對應。使用inspect模組 inspec...