查看原文
其他

对抗bug方法介绍——爆款pysnooper你用了吗?(上篇)

爬虫俱乐部 Stata and Python数据分析 2022-03-15


本文作者:张   邯

文字编辑:宁刘莹

技术总编:张学人

好消息!!!爬虫俱乐部将于2019年7月5日至7月8日在武汉举行首期Python编程技术定制培训。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python爬虫技术,并明确未来更进一步的学习方向。

详细培训大纲及报名方式,请点击文末阅读原文呦~


在漫漫的编程之路上,有两个东西会伴随着我们始终,一个是永远都不知道什么时候出现的bug,一个是为了调试程序而加的班。不论是菜鸟上路,还是老司机写工程,写出来的程序总有“自己的想法“,就问你惊不惊喜、意不意外、开不开心~

调试bug也是一门学问,每个程序猿都有自己的独门绝技,无论是print大法,还是一些IDE提供的辅助,可谓八仙过海各显神通,爬虫俱乐部之前介绍的logging模块记录日志也可以做程序监测。本篇文章将介绍一个GitHub上新出的新星项目,其火爆程度不亚于前段时间的优衣库限量款。作者尝试了之后,也不禁大叹“知我心者,pysnooper也!”忍不住立刻马上和上头申请,把这个神奇的东西推荐给我们的粉丝们,为大家在python学习和使用中的bug之战提供一个强有力的武器。

我们现在先写一个函数,用来实现一个功能:给定一个正整数,将小于这个数的偶数输出,此处为了方便演示,不考虑非法参数的情况啦:

def GetEven(num): for i in range(1,num): if i % 2 == 0 : print(f'{i}是偶数')
GetEven(10)

可以看到,屏幕上输出了10以内的偶数:

2是偶数4是偶数6是偶数8是偶数

在介绍它最简单粗暴的监听方式之前,我们可能需要介绍一个名词:装饰器(Decorator)。这是一个与函数相关的概念,所谓“装饰”,是对函数进行的一种操作,大概产生的效果就是,在执行这个函数之前,先把装饰器里的代码执行一遍,然后再继续执行原来的函数,在给复杂的项目中的函数增加功能时,使用装饰器可以不用动之前的函数。它的常见写法是“@”加一个装饰器名(某种意义上来说也是一种函数,不必纠结),在接下来的推文中,我们会详细介绍它的机制和作用,现在先记住即可。

下面展示一下,pysnooper是如何工作的。

安装依然是cmd下输入命令 “pip install pysnooper”,成功安装后,在程序中只加入两句话:

import pysnooper@pysnooper.snoop()def GetEven(num): for i in range(1,num): if i % 2 == 0 : print(f'{i}是偶数')
GetEven(10)

再次运行,我们可以看到,日志被输出到了屏幕上,我们截取前一段进行说明。

Starting var:.. num = 1015:07:18.001836 call 4 def GetEven(num):15:07:18.002654 line 5 for i in range(1,num):New var:....... i = 115:07:18.002826 line 6 if i % 2 == 0 : print(f'{i}是偶数')15:07:18.002826 line 5 for i in range(1,num):Modified var:.. i = 215:07:18.002826 line 6 if i % 2 == 0 : print(f'{i}是偶数')2是偶数

在这段日志中,我们得到了变量(num和i的值)、执行时间、执行代码行等信息,其中New var表示新建了一个变量,Modified var 表示变量被更改。Debug的时候想要的信息几乎都有了~

爬虫俱乐部将于2019年8月22日至28日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。

初级班主要是为了让学员掌握Stata数据分析技巧,并能独立撰写相关的程序。涉及内容包括多种数据格式的读取和输出、数据的合并、实证结果的输出以及爬虫俱乐部编写的命令介绍等。

高级班主要是为了让学员掌握Stata软件进阶操作,涉及内容包括正则表达式、网络爬虫技巧、文本分析等技术。经过团队精心策划,此次课程新增北大法宝裁判文书信息提取和百度地图api调用两大案例,以及新兴实证研究方法介绍,相信定能让学员受益匪浅!

扫描下方二维码提交报名信息→缴费→发送缴费截图至statatraining@163.com(邮件主题为“爬虫俱乐部2019暑期Stata培训+姓名+单位+班次”)→报名成功。

               



另外如果日志太长,输出到屏幕上看不过来,还可以输出到文件中,依然很简单,只需要加一个参数,将命令改成:

@pysnooper.snoop(“e:\\log0.txt”)

再运行程序后,在E盘下就有了对应的文件,里面记录的内容与屏幕上打印的别无二致,不做展示。

如果你需要监听不同的函数,或者同一个函数进行了很多次调试,可能需要进行区分,那么还有一个参数可以帮助你:prefix,这个参数确定一个字符串,加在每条日志的前面,这样可以帮助你做好标签,便于查找:

@pysnooper.snoop("E:\\log0.txt",prefix = "偶数函数第一次调试")

得到的文件如下效果(只截取了部分):

上面是第一次展示输出文件时写入的记录,下面是展示前缀时写的日志记录,这样,当你调试很多次或者一次很多函数的时候,有了前缀就可以很清晰很轻易地区分出他们,或者用查找来定位到所需要的信息。

当然,爆款之所以为爆款,这些小本事还是不够的,在下篇中,我们还会介绍pysnooper更多好用的用法~如果学会了,就加入到你的日常使用当中吧!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存