python进阶 -- 日志装饰器详解

日志

日志:记录程序运行的时候,出现的问题,或者说验证流程是否正常
在实际工作中,python的脚本命令一般是放在服务器执行的linux系统
日志其实就是记录程序运行时出现的问题、或者正常的打印,协助出现问题的时解决排查问题

python中内置的日志模块可以直接导入:

import logging

日志模块:会有日志的级别设置
级别是自己设置的,可以通过自定义的级别去确定什么东西该被记录,什么东西部该被记录

注意:设置日志级别的时候,单词全部需要大写

● DEBUG:等级最高,包含debug、info、warning、error的4种全部日志
● INFO:不包含debug日志
● WARING:不包含debug、info日志
● ERROR:不包含debug、info、warning日志
如果需要调整日志级别,level=logging.后面修改即可 

简单使用示例

import logginglogging.basicConfig(level=logging.INFO) #设置日志的打印级别def fun1():logging.debug("debug打印")logging.info("info打印")logging.warning("warning打印")logging.error("error打印")
fun1()

 通常,在写代码的时候,我们会将一段段的代码执行结果加上日志的输出,方便在本地查看代码是否执行成功

例如:现在有一段业务逻辑代码,在执行这段代码的同时加上日志的输出

import logginglogging.basicConfig(level=logging.INFO) #设置日志的打印级别def fun1():logging.debug("debug打印")logging.info("info打印")logging.warning("warning打印")logging.error("error打印")
#fun1()def fun2(func_name):func_name()  #调用传入的函数本体print("这是fun2函数的调用")fun2(fun1)

方式1:代码如上,在fun2函数调用时,括号内加上fun1这个函数名即可 

方式2:
fun2的输出内容中,fun2的原本内容与fun1的内容没有先后顺序,是并行的

所以也可以写成:最后调用时,函数1(函数3),如下:

import logginglogging.basicConfig(level=logging.INFO) #设置日志的打印级别def log_info(fun_name):logging.info("日志开始记录")fun_name()logging.info("函数执行结束")def fun3():print("fun3代码执行")log_info(fun3)

方式3:用一个变量接收,然后调用新的变量名

import logginglogging.basicConfig(level=logging.INFO) #设置日志的打印级别def log(fun_name):def wrapper():logging.info("日志开始记录")return wrapper  #不加括号,只是获取了wrapper这个函数的内存地址def fun4():print("fun5函数执行")method = log(fun_name=fun4)
method()  #但输出只完成了一半,并没有输出fun4的内容打印

装饰器

装饰器是Python中一种强大的编程工具,它可以用于修改、包装或扩展函数或方法的行为。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数或修改后的函数。装饰器通常用于在不修改原始函数代码的情况下,为函数添加额外的功能。

作用:

  1. 代码复用:装饰器可以用来封装通用的功能,例如日志记录、性能分析、权限检查等,以便在多个函数中重复使用。
  2. 代码修改:装饰器可以在不修改原始函数代码的情况下,对函数的行为进行修改,例如添加新的前置或后置处理逻辑。
  3. 元编程:装饰器本身是元编程的一种形式,它允许在运行时动态地修改函数或方法的行为。

装饰器的使用

接着上面的栗子,看看加上装饰器之后的代码: 

步骤:在fun5的头部加一个@函数名称,函数名称即装饰器的函数名称
在自动化的框架里面,有很多装饰器的应用,以及可以自定义装饰器去完成调用
import logginglogging.basicConfig(level=logging.INFO) #设置日志的打印级别def wrapper():logging.info("日志开始记录")fun()return wrapper  #不加括号,只是获取了wrapper这个函数的内存地址@log   #默认会把fun5的函数本体,传入到装饰器的参数里去
def fun5():print("fun5函数执行")fun5()

函数与装饰器一对多使用

一个函数是否可以使用多个装饰器?

一个函数使用了多个装饰器,执行的顺序是什么?

一起来看个案例:

def fun1(fun1_name):def fun2():print("fun1装饰器调用")fun1_name()return fun2def fun2(fun2_name):def fun3():print("fun2装饰器调用")fun2_name()return fun3@fun2
@fun1
def fun4():print("fun4函数调用")fun4()

所以:

一个函数,可以使用多个装饰器

如果一个函数使用了多个装饰器,执行顺序,是按照装饰器的顺序,从上往下执行的 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AMEYA360 | 热敏电阻的工作原理及作用 热敏电阻厂商有哪些

摘要:热敏电阻是一种传感器电阻,其电阻值随着温度的变化而改变。热敏电阻的工作原理是使用传感器来帮助调节温度高低,作用包括电压调节,音量控制,时间延迟和电路保护。热敏电阻具有测温、温度补偿、过热保护、液面测量…

ArrayList 与 LinkedList 区别?

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! 是否保证线程安…

竞赛保研 基于深度学习的人脸识别系统

前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/…

如何脱离keil在vscode上实现STM32单片机编程

【VScode Embedded IDE】Keil工程导入VScode,与Keil协同开发MCU_vscode编辑keil工程-CSDN博客 从零开始的51单片机——VsCodeEIDE环境搭建_vscodeeidesdcc-CSDN博客 结合一下这两个大佬的博客就是可以实现STM32的编程了 主要要点: (1&#…

为什么要有虚拟线程(Java项目Loom)?

JEP No 425 是我期待已久的东西。这是 JDK 19 的并发 API 中添加的一个新概念。它处于预览阶段,很快它将在未来的几个版本中成为 JDK 中的永久功能。 虚拟线程非常轻量级,可以减少编写、维护和观察高吞吐量应用程序的工作量。 在这一部分中&#xff0c…

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

HarmonyOS 编写副标题 解决 ubTitle 可能淘汰问题

目前 harmonyos 中 title属性目前用的还正常 但是ubTitle副标题 会提示我们 可能要淘汰了 虽然说 我们目前 强行用 还是可以生效 但可能 哪天版本更新移除了这个属性 代码就报错了 我们可以通过Builder 来写这个副标题 和 标题 Entry Component struct Index {build() {Row(…

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

ROS2 Humble学习笔记

本文发表与个人的github pages。部分内容未同步到这里。 想查看完整内容&#xff0c;请移步到ROS2 Humble学习笔记。 一、前言 2013年的时候已经接触ROS了&#xff0c;当时断断续续学习了一些ROS的基础知识。16年搬到深圳之后&#xff0c;也有幸参加过星火的一次关于ROS的一些…

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

如何通过绘制【学习曲线】来判断模型是否【过拟合】

学习曲线是一种图形化工具&#xff0c;用于展示模型在训练集和验证集&#xff08;或测试集&#xff09;上的性能随着训练样本数量的增加而如何变化。它可以帮助我们理解模型是否受益于更多的训练数据&#xff0c;以及模型是否可能存在过拟合或欠拟合问题。学习曲线的x轴通常是训…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 样例图 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 样例图 非叶子节…

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

Python库中关于时间的常见操作

目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳&#xff1a; 将时间戳转换为日期和时间&#xff1a; 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中&#xff0c;时间处理是一个重…

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…

《亚太教育》是什么级别的期刊?是正规期刊吗?能评职称吗?

《亚太教育》主要发表教育理论研究、教育教学实践、学校管理、学科教育、科研管理等学术论文以及其他与教育教学相关的学术论文和研究成果,现征集教育管理以及各学科优秀论文。欢迎.各位教师、教育工作者及高校学生踊跃投稿。 收录情况&#xff1a;知网万方维普收录 投稿方式&a…

vscode使用npm安装element-UI并添加router路由

npm安装vue&#xff0c;添加淘宝镜像-CSDN博客 elementUI安装与配置 安装可以看我上一篇文章 vscode控制台输入指令 npm i element-ui -S 安装完成后在目录结构打开下图文件 可以看到多了一行elementui就代表安装成功了 下面是项目常用的结构 安装完成后需要启用elementU…

Java项目:114SSM图书管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 图书管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要实现了图书馆借书还书功能&#xff0c;系统分为管理员和读者两种角色。 管理员功能如下…