python装饰器函数执行后日志_使用python强大的装饰器,监控数据自动化流程日志...

装饰器是python当中的进阶用法,并且应用非常广泛,但是在实际的工作过程中,我发现很多人常常因为觉得装饰器很复杂,望而生畏。实际上从原理来讲并不难。

这一节,我会从函数为切入点,引出装饰器的概念和基本用法,最后再结合我们的数据自动化程序,这个实际的例子,让大家能够使数据自动化程序功能更加的完善,并且学会装饰器的用法,先来看一下,最终钉钉报警的效果:

b90e7bec54e736d1c673b0a918e643c5d4626968.jpeg?token=40eaa34f3bdb9469c8ec634cc80c6888

钉钉报警效果

1、函数核心知识点

第一点:函数可以作为对象,赋予给变量

242dd42a2834349bab1c4dfb435c19c937d3bef7.jpeg?token=eb36007076f39a9d4dd91c96a4b2e57c

函数作为对象

这里把func这个函数,赋值给了send_message,所以最终当执行send_message的时候,就相当于执行了func()这个函数。

第二点:函数可以作为参数,传递到另一个函数当中

4d086e061d950a7b78b16ece8c676edef3d3c975.jpeg?token=9284b9187bf49d7f34c33163f0b0e0e4

函数作为参数

root_call这个函数当中,第一个参数是一个函数,调用root_call的时候,传入了get_message这个函数,然后把message这个参数,传递给get_message。

第三点:函数里可以嵌套函数

d50735fae6cd7b89ade710a589924ea0d8330e4d.jpeg?token=c17cd0dadd11df0a6e006b61678ac431

函数的嵌套

我们先看func( )这个函数,它最终return的是get_message()这个函数,当程序执行到这里时,就会回去调用get_message,从而完成函数的嵌套。

第四点:函数的返回值也可以是函数

024f78f0f736afc390438b0031afe7c3b6451241.jpeg?token=2ec92bb879720ecbf9617eb8f0b8b87d

函数作为返回值

这里,函数 func_closure() 的返回值是函数对象 get_message 本身,之后,我们将其赋予变量 send_message,再调用 send_message(‘hello world’),最后输出了'Got a message: hello world'。

2、装饰器的基础知识

如果以上函数的知识大家都能看明白的话,那么学习接下来的装饰器将会非常轻松,

我们先来看一个最简单的例子:

bba1cd11728b4710b2eae38c4678cffafe0323e1.jpeg?token=db8e9f161a255405388722bbaad21902

这段代码中,my_dacorator函数当中嵌套了wrapper函数,wrapper函数当中又包含了作为参数传递进来的func()函数,其实最终的目的,是在执行func函数之前,先执行wrapper当中的部分,并不改变func函数的执行过程,所以,my_decorator这个函数仅仅对greet增加了一层装饰作用。

实际上,在python当中有更加优雅的写法,就是要讲的装饰器,用装饰器的写法如下:

c8ea15ce36d3d539b0fcfeb3be31e557342ab03e.jpeg?token=18ce95829b8f686d63a1181419d3b200

这段代码和之前的代码具有相同的功能,并且非常的简洁,@my_decorator就相当于前面的greet=my_decorator(greet)语句,这样写还有一个好处,就是如果其他函数也想用my_decorator装饰,那只需要把@my_decorator加在函数的上面就可以了。

如果所装饰的目标函数是带有参数的,那么只需要加到wrapper()函数当中就可以了,前面我们也讲过,使用*args和**kwargs可以代表任何参数,所以我们只需要写成下面的样子:

f603918fa0ec08fa714d5c0bd358316a54fbda0e.jpeg?token=c6ff650ba941ac4bbc68e28a17330b09

带有参数的装饰器

关于装饰器的基础部分,今天就先给大家讲这些,详细的内容,我会在视频课程当中为大家讲解。

3、实战案例:用装饰器监控程序执行,并把错误发送到钉钉报警

学完了装饰器的基础,我们就把装饰器用在项目上。首先在utils文件夹下面创建一个py文件,我这里命名为mysql_error:

a6efce1b9d16fdfaa3b61f4d3f39805396ee7bfc.jpeg?token=421e02127df45ea68228ae7428d2e4dc

话不多少,先上代码:

a8ec8a13632762d053c6696e245a04fd533dc6a1.jpeg?token=8955036b906fb39022e359e79abfd1fb

装饰器函数

这个装饰器,用到的就是上面讲的知识点,唯一一个没有讲到的是@functools.wraps(func)方法,因为每个装饰器会在很多地方用到,装饰器装饰过的函数,其原有的基本信息会被改变,比如说函数名称等,都会变成装饰器的信息,这样的话,如果程序出现错误,我们也不到是哪个被装饰的函数出现了错误,不便于排查,加上@functools.wraps(func),可以保持被装饰函数信息不变。func_name = func.__name__就是获取被装饰函数名称,

我还用到了一个方法字符串处理方法 StringHelp.error(error_str),这个是我自定义的方法,详细如下:

a50f4bfbfbedab6467d985ba7080a3c478311e5a.jpeg?token=173bce2a9b1fcb453e90630553390917

报错字符串处理模块

模块的功能已经给大家标注了,有不理解的同学欢迎留言讨论。

最后,把写好的装饰器应用在get_df函数上:

9922720e0cf3d7ca8d46bf8a78a9b20e6963a9dc.jpeg?token=bd0c5282e2a60446aacbcafb00172847

给数据查询函数加上装饰器

还记得我们上节课的数据获取功能吗,这里我故意把SQL写错,看一下效果:

f9198618367adab41b1b03960f62bf1b8501e45d.jpeg?token=29d4416c867b3268aeb002d286e2e129

来看下运行效果:

b90e7bec54e736d1c673b0a918e643c5d4626968.jpeg?token=40eaa34f3bdb9469c8ec634cc80c6888

钉钉完成报警

这样钉钉就完成了报警功能,如果线上出问题的话,我们就能第一时间定位错误,解决问题,如果大家按照这样做的话,那么可想而至,等待你的将会是升职加薪。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值