这里收集一下最近遇到的不错的装饰器的例子,或许今后会用得到。
retry
适用场景为重试机制,比如网络不稳定,服务不稳定。
#coding: utf8
__author__ = "郭 璞"
__email__ = "marksinoberg@gmail.com"
# 实现一个retry的装饰器
import time
import logging
import socket
from functools import wraps
logging.basicConfig(level=logging.DEBUG)
def retry(retries=3):
def wraper(func):
def proxy(*args, **kwargs):
count = retries
trueerror = None
while count > 0:
try:
return func(*args, **kwargs)
except Exception as e:
print("relay times: {}".format(count))
count -= 1
time.sleep(1)
trueerror = e
print(e)
return trueerror
return proxy
return wraper
@retry(retries=3)
def check():
sk = socket.socket()
sk.settimeout(5)
sk.connect(('127.0.0.1', 80))
if __name__ == "__main__":
check()
博友Michael翔 指出python3中except的as e 会被移除,因此加了一个临时变量来记住对应的异常信息。然后抛出去。
cache
前天在GitHub上看到一个很经典的cache装饰器,原理比较简单,相当于把数据临时存储起来,供不时之需,期以减少计算,提升程序运行效率。
wrapcache
真的挺赞的,里面的LRU算法值得学习下,但是相对来说
logging
# 做一个logger
def logging(filename="", level=0):
def wrapper(func):
def log(*args, **kwargs):
with open(filename, "a") as file:
line = "[LEVEL: {}] {}, {}\n".format(level, args, kwargs)
file.write(line)
file.close()
# 需要有返回值就return,否则就不用return
return func(*args, **kwargs)
return log
return wrapper
@logging(filename="query.log", level=1)
def query(msg):
print(msg, " be carried.")
return "`{}` has beed logged.".format(msg)
print(query("select * from user where userid = 2614677"))
作为典型的切面需求,logging还是很有用的。