装饰器中添加参数

2023-05-16

一个简单场景:我有一个给函数计时的装饰器,现在我想给函数运行的时间添加一个时间偏移量time_lag,该时间偏移量不是常数,想通过把该参数传入装饰器中来实现。

  • 实现方式1:
import time
from functools import wraps
def timer_func(func,time_lag):
    @wraps(func)
    def wer(*args,**kwargs):
        t1=time.time()
        r=func(*args,**kwargs)
        t2=time.time()
        cost=t2-t1+time_lag
        print('time cost %s'%cost)
        return r
    return wer

def func(n:int):
    while n>0:
        n=n-1
    return n
a=timer_func(func,time_lag=10)
a(1000000)

但是这样的实现方式,就无法语法糖@,每次都要通过函数调用来实现,就失去了装饰器简明、方便的特点了。

因此用另一种实现方式,只需要在原有装饰函数外面再嵌套一层外函数,将想传入装饰器的函数传入最外层函数即可,实现方式如下:

  • 实现方式2:
from functools import wraps
import time
def timer(time_lag):

    def decorator(func):
        @wraps(func)
        def wer(*args, **kwargs):
            t1 = time.time()
            r = func(*args, **kwargs)
            t2 = time.time()
            cost = t2 - t1
            res=cost+time_lag
            print('time cost %s' % res)
            return func(*args, **kwargs)#返回函数本身结果
        return wer#返回内函数
    return decorator#返回外函数

def func(n:int):
    '''
    this is a func test
    :param n:
    :return:
    '''
    while n>0:
        n=n-1
    return n

>>>a=timer(10)#返回外函数,#传入time_lag=10
>>>print(a)
<function timer.<locals>.decorator at 0x000002027D8E5E50>
>>>b=a(func)#返回内函数
>>>print(b)
<function func at 0x000002027D9434C0>
>>>c=b(999999)#调用内函数返回结果
>>>print(c)
time cost 10.069796323776245
0

上述逐步调用的过程只是为了清晰的展示,该函数看起来复杂,实际上本质思想还是闭包的思想,只是在装饰器外再嵌套了一层外函数。每个外函数返回的是它的下一级内函数。最内层函数返回的是调用函数的结果。该方式还可以通过语法糖简明的调用:

@timer(10)#传入time_lag=10
def func(n:int):

    while n>0:
        n=n-1
    return n
>>>func(99999)
time cost 10.008002042770386

@timer(20)#传入time_lag=20
def func1(n:int):

    while n>0:
        n=n-1
    return n
>>>func1(22222222)
time cost 21.447203874588013
  • 创建一个带参数的日志装饰器

创建一个日志装饰器,该日志的输出等级、名称、信息通过传参传入装饰器中

def logged(level,name=None,message=None):

    def decorator(func):
        logname=name if name else func.__module__
        log=logging.getLogger(logname)
        logmsg=message if message else func.__name__

        @wraps(func)
        def wraper(*args,**kwargs):
            log.log(level,message)
            return func(*args,**kwargs)
        return wraper
    return decorator

@logged(logging.DEBUG,'test_name')
def func(a):
    return a+1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

装饰器中添加参数 的相关文章

  • Windows下GCC的安装和使用

    一 安装 1 为了在 Windows 上安装 GCC xff0c 需要到MinGW 的主页 www mingw org下载最新版本的 MinGW 安装程序 eg xff1a https osdn net projects mingw dow
  • 实战:CAS搭建

    一 CAS服务器的搭建 1 下载CAS服务器的源码 xff0c 我下载的是CAS Maven WAR Overlay 的分支4 2 X版本 注 xff1a 如若不想了解查找下载地方过程 xff0c 请直接参见 xff08 3 xff09 的
  • 单例模式(双锁机制实现)

    单例模式 xff1a 保证一个类仅有一个实例 xff0c 并提供一个访问它的全局访问点 实现重点 xff1a 私有构造器 xff0c 一个静态方法和一个静态变量 实现单例模式的方法有很多种 xff0c 主要分析一下使用双锁机制实现的方式 该
  • 在Windows环境下安装及配置gcc编译器

    我们都知道 xff0c gcc是GNU操作系统的编译套件 xff0c 那么在Windows系统下可以使用gcc吗 xff1f 答案是可以的 介绍MinGW 首先我们先介绍下MinGW MinGM是指只用自由软件来生成纯粹的Win32可执行文
  • 基于51单片机的智能窗帘仿真原理图程序设计

    仿真图 xff1a 原理图 xff1a 系统概述 整个系统以STC89C52单片机为核心器件 xff0c 配合电阻电容晶振等器件 xff0c 构成单片机的最小系统 其它个模块围绕着单片机最小系统展开 其中包括 xff0c 显示设备使用160
  • 构建Docker镜像时处理'Configuring tzdata'交互输入

    在Dockerfile中安装deb软件包时 xff0c 某些软件将tzdata作为依赖项安装 tzdata会以交互方式提醒用户选择使用位置 Configuring tzdata Please select the geographic ar
  • Python快速上手系列--元组--详解篇

    上一章的列表内容有点多 xff0c 需要时间进行消化 本篇来看看与其类似 xff0c 但又不同的一个内容 元组 元组使用小括号 xff0c 也称为圆括号来表示 也可以不使用这样的方式 xff0c 直接用 隔开就好 看例子 xff1a 定义一
  • 爬虫|Python|ts格式的加密视频合并方法

    前言 xff1a 爬虫的一些基本概念 xff1a 对于爬虫来说 xff0c 没有道德 xff08 比如 xff0c 某些爬虫上w的并发 xff0c 那么 xff0c 一些小站可能就会崩溃 xff0c 其实爬虫也是可以作为网络攻击的 xff0
  • 2022年ADB 命令知多少?一文2000字详细 ADB 命令大全来啦

    一 ADB 简介 1 什么是 ADB ADB 全称为 Android Debug Bridge xff0c 起到调试桥的作用 xff0c 是一个客户端 服务器端程序 其中客户端是用来操作的电脑 xff0c 服务端是 Android 设备 A
  • 线性判别分析 LDA(Linear Discriminant Analysis)

    算法目标 线性判别分析 xff0c 主要用于分类 xff08 Classification xff09 降维 xff08 Dimensionality Reduction xff09 领域 基本思想是 xff0c 找到一个单位向量 xff0
  • ubuntu安装vnc

    https blog csdn net qq 27009517 article details 86308611 https blog csdn net Cloris Sue article details 109559151
  • el-select绑定值为对象时,报错[Vue warn]: <transition-group> children must be keyed: <ElTag>

    el select绑定值为对象时 xff0c 报错 Vue warn children must be keyed 出现这种事情 xff0c 基本上就是你的el select 的 v model所绑定的是一个对象 xff0c 或者是一个数组
  • 自定义网桥模式实现跨主机Docker通信

    概念 不同主机上的Docker容器通过某些方法可实现跨主机通信 xff0c 但是一般不同主机上的Docker容器内的IP地址不是处于同一个网段 xff0c 但是可以通过自定义网桥的方式 xff0c 将不同主机的自定义网桥设定为同一个网段 x
  • Kubemetes网络插件cni

    因为项目中需要使用k8s部署swagger服务 xff0c 然后在kubectl create这一步出现了如下报错 xff0c 找不到网络插件 failed to find plugin span class token string 34
  • Ubuntu GNOME从入门到喜欢

    原文链接 xff1a Ubuntu GNOME从入门到喜欢 Keep Thinking 在Ubuntu官网下载的Ubuntu 16 04版本是Unity版本 xff0c Unity版本也可以 打扮 的很美观 xff0c 并且和今天介绍的GN
  • 51单片机的室内环境监测系统,MQ-2烟雾传感器和DHT11温湿度传感器,原理图,C编程和仿真

    设计要求 1 以51单片机为控制核心 xff0c 利用温湿度传感器和烟雾传感器完成对室内环境数据的采集和处理 xff1b 2 LCD1602液晶实时显示温湿度 烟雾浓度等数据 xff1b 3 用户能够通过按键设置温湿度上下限报警阀值和烟雾报
  • centos设置Tomcat8自启动

    1 cd etc init d 2 vi tomcat8 3 粘贴自启动命令 注意替换自己的JAVA环境变量和 TOMCAT的HOME bin bash tomcat startup script for the Tomcat server
  • 光谱图是这样得到的

    http www aist go jp RIODB SDBS menu e html 一个免费图谱数据库 含 4 98 万张 IR 图谱 向热心提供网址的 celan 老师致敬 今天看到一个网友发帖说不会使用 4 98 万张图谱的查询功能
  • postgresql |数据库 |postgresql数据库的短命令详细介绍

    前言 xff1a postgresql数据库相比较MySQL或者oracle xff0c 一个是开源优势 xff0c 另一个就是postgresql数据库的命令行更为丰富 xff0c 因此 xff0c 数据库的管理工作更为方便 xff0c

随机推荐

  • Ubuntu 配置自带桌面共享

    安装dconf editor span class hljs built in sudo span apt install dconf editor打开dconf editor xff0c 依次展开org gt gnome gt deskt
  • 堆排序 C++非递归 通俗易懂

    堆排序 原理 xff1a 对于堆的定义也可以使用完全二叉树来解释 xff0c 因为在完全二叉树中第 i 个结点的左孩子恰好是第 2i 个结点 xff0c 右孩子恰好是 2i 43 1 个结点 如果该序列可以被称为堆 xff0c 则使用该序列
  • 6.检测物理内存的容量

    操作系统是管理硬件的大管家 xff0c 所以它要知道有哪些硬件资源啊 比如要检测内存 xff0c 知道内存的容量 1 学习 Linux 中的获取内存的方法 学习 Linux 中的获取内存的方法 xff0c 调用 BIOS 中断 0x15 来
  • MBR、EBR、OBR的区别和联系

    先看图 xff1a 一块硬盘 xff0c 最开始只能实现4个分区 xff0c 也就是4个主分区 后来的发展 xff0c 4个分区不够用了 xff0c 可以有一个分区作为扩展分区 xff0c 用它来作为总扩展分区 xff0c 里面可以分成很多
  • 多文档编辑器--(2)创建子窗口类

    为了更好的在MDI Area中添加子窗口 xff0c 那就子类化子窗口 xff0c 它继承自 QTexiEdit 类 1 添加新文件 选择新建一个 类 类名为 xff1a MdiChild xff0c 继承自 QTextEdit 2 子窗口
  • 多文档编辑器--(3)菜单项的功能

    在前面两节中 xff0c 实现了界面的设计 xff08 菜单项 xff09 和子窗口类的实现 xff0c 下一步就是实现菜单项的功能 xff0c 就是把菜单项和子窗口类的成员函数关联起来 1 项目文件 2 mainwindow h 头文件
  • C++和C语言函数互相调用

    C 43 43 中调用C函数 span class token comment xx h span span class token keyword extern span span class token keyword int span
  • 指针作为函数形参

    先来看两个程序 程序1 span class hljs comment include lt stdio h gt span void fun span class hljs keyword int span span class hljs
  • C++实现俄罗斯方块_源码_详细注释

    1 在linux下安装ncurses库 sudo apt get update sudo apt get install libncurses5 dev 2 编译时 l 选项引入 ncurses 库 g 43 43 main cpp l n
  • 整理的最完整的OFPT_STATS_REQUEST && REPLY消息-部分转载(含有1.0与1.3的对比)

    OFPT STATS REQUEST amp amp REPLY 以上的消息如hallo等都是通信过程中必须的部分 还有一些数据包是为了某些目的而设计的如OFPT STATS REQUEST amp amp REPLY可以获得统计信息 xf
  • [go]汇编语言

    文章目录 计算机结构常量与变量全局变量常量数组字符串 函数参数与返回值goroutine Go汇编程序无法独立使用 xff0c 必须以Go包的方式组织 xff0c 同时包中至少要有一个Go语言文件用于指明当前包名等基本包信息 如果Go汇编代
  • TI8168 DSP算法开发流程

    一 DM8168及本文简介 2010年 xff0c TI推出的最新媒体处理器TMS320DM8168作为一款多通道高清SOC系统芯片 xff0c 集成了1GHz主频Cortex A8 ARM核与lGHz主频C674x的DSP核 xff0c
  • linux虚拟机服务器主机不能访问配置防火墙的命令

    问题 xff1a 虚拟机部署tomcat服务器 xff0c 主机能ping通虚拟机 xff0c 不能访问项目 解决 xff1a 1 关闭启动防火墙 sudo service iptables stop 停止 sudo service ipt
  • 解决创建maven工程时,产生“找不到插件的错误”

    今天就来为大家解决一下我们在创建maven工程 xff0c pom xml中一堆报错问题 首先 问题 xff1a 按照以下步骤 xff0c 进行排查 xff0c 如果好了 xff0c 就不用继续往下排查了 第一步 xff1a 点击idea右
  • 4年外包终上岸,我只能说这类公司能不去就不去...

    我大学学的是计算机专业 xff0c 毕业的时候 xff0c 对于找工作比较迷茫 xff0c 也不知道当时怎么想的 xff0c 一头就扎进了一家外包公司 xff0c 一干就是4年 现在终于跳槽到了互联网公司了 xff0c 我想说的是 xff0
  • 为什么越来越多的人从开发转测试?

    首先 xff0c 相比开发以后的职业生涯 xff1b 对软件测试的未来更看好 xff1b 其次 xff0c 具有开发经验 对软件测试会有相当大的帮助 xff0c 前面学了测试基础工具后 xff0c 后期自动化提升会更快 这样才能更好的胜任软
  • 金三银四总计面试碰壁15次,作为一个27岁的测试工程师.....

    3年测试经验原来什么都不是 xff0c 只是给你的简历上画了一笔 xff0c 一直觉得经验多 xff0c 无论在哪都能找到满意的工作 xff0c 但是现实却是给我打了一个大巴掌 xff01 事后也不会给糖的那种 先说一下自己的个人情况 xf
  • 2023年最新软件测试面试题合集(内附详细答案)好不容易进了头条软件测试岗,全靠这套面试题秘籍

    最近看到网上流传着各种面试经验及面试题 xff0c 往往都是一大堆技术题目贴上去 xff0c 但是没有答案 为此我业余时间整理了这份软件测试基础常见的面试题及详细答案 xff0c 望各路大牛发现不对的地方不吝赐教 xff0c 留言即可 01
  • 从功能测试转型到高级自动化测试,应该学习些什么?

    在软件测试行业 xff0c 功能测试一直是测试团队的基础任务 xff0c 也是开发团队交付产品前必须经过的流程 但是 xff0c 随着软件系统的复杂性和需求的增加 xff0c 传统的功能测试方法已经无法满足高效测试的需求 这时候 xff0c
  • 装饰器中添加参数

    一个简单场景 xff1a 我有一个给函数计时的装饰器 xff0c 现在我想给函数运行的时间添加一个时间偏移量time lag xff0c 该时间偏移量不是常数 xff0c 想通过把该参数传入装饰器中来实现 实现方式1 xff1a span