IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python decorator -> 正文阅读

[Python知识库]python decorator

Python decorator 记录


前言

简单记录,不断更新。

提示:以下是本篇文章正文内容,下面案例可供参考

一、decorator简介

decorator 本质是一个函数,与其他函数不同的是,它的的入参也是一个函数,返回值是一个对象,可以让其他函数在不增加代码的前提下增加额外功能。

二、应用场景

插入日志,计算运行时间,事物处理。
有了decorator,可以抽离出大量与函数功能本身无关的雷同代码。

三、分类

函数decorator和类decorator

四、基本使用

1. 基础使用

case1: 记录一个函数执行所需时间
original code:

def func1():
    startTime = time.time()
    print("this is func1")
    time.sleep(2)
    execTime = time.time()-startTime
    print("total exec time %s." % execTime)

如果想要记录一百个函数的执行时间,会有大量雷同代码。因此,使用decorator
now:


def timeCalc(func):
    def wrapper():
        startTime = time.time()
        func()  # exec func
        execTime = time.time()-startTime
        print("%s exec need time %s" %(func.__name__, execTime))
    return wrapper

# @timeCalc = timeCalc(fun3)
@timeCalc
def fun3():
    time.sleep(3)

@timeCalc   
def fun4():
    time.sleep(4)

2. 带参数的decorator

def timeCalc(func):
    def wrapper(*args, **kwargs):
        startTime = time.time()
        func(*args, **kwargs)  # exec func
        execTime = time.time()-startTime
        print("%s exec need time %s" %(func.__name__, execTime))
    return wrapper

@timeCalc
def funcAdd(x, y):
    print('x + y = ', x+y)
    time.sleep(1)

@timeCalc
def funcAddMore(x, y, z):
    print('x + y + z = ', x+y+z)
    time.sleep(2)

3. decorator本身可以带para

def timeCalc(level):
    def outWrapper(func):
        def wrapper(*args, **kwargs):
            startTime = time.time()
            func(*args, **kwargs)  # exec func
            execTime = time.time()-startTime
            print("%s %s exec need time %s" %(level, func.__name__, execTime))
        return wrapper
    return outWrapper

@timeCalc(level="info")
def funcAdd2(x, y):
    print('x + y = ', x+y)
    time.sleep(1)

@timeCalc(level="debug")
def funcAddMore2(x, y, z):
    print('x + y + z = ', x+y+z)
    time.sleep(2)

funcAdd2(1,2)
funcAddMore2(1,2,3)

4. 实际使用

background: try-catch 的使用降低代码的可读性,使用decorator 减少try-catch. 当func抛出异常时,decorator默认catch exception.

DEFAULT_FAULT_KEY = "defaultKey"

def RunTaskFunc(taskFunc, fault, funName):
    logger.error("output all kinds of info %s %s" % (fault, funName))
    try:
        taskFunc()
    except Exception as e:
        logger.exception("exception")

def taskGuard(fault=DEFAULT_FAULT_KEY):
    def inner(func):
        @functools.wraps(func)
        def wrapper(task, **kwargs):
            RunTaskFunc(lambda: func(task, **kwargs),
                        fault, func.__name__)
        return wrapper
    return inner
    
@taskGuard(fault="commonFuncKey")
def commonFunc(task="task"):
    a = 1/0
    return

commonFunc(task="commonFuncTask")

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:24:53  更:2022-11-05 00:28:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:29:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码