偶遇不错的装饰器

本文分享了三个实用的Python装饰器:retry用于实现重试机制,适用于网络或服务不稳定的情况;cache是一个缓存装饰器,提高程序运行效率;logging则讨论了如何利用装饰器进行日志记录,满足切面编程需求。
摘要由CSDN通过智能技术生成

这里收集一下最近遇到的不错的装饰器的例子,或许今后会用得到。

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还是很有用的。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值