Python 调试工具PySnooper
相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print
函数来打印一下参数来调试。虽然用print
也是不失为是一种方法,但是有时如果疑惑的地方多就要每个地方都要加print
,这样就显得比较麻烦了。
今天发现在Github开源了一个神器,可以清楚让你清楚了解函数内部的运行以及参数值的变化,PySnooper
,项目地址:https://github.com/cool-RR/PySnooper
使用简单,强大,谁用谁知道它的好!下面简单说一下PySnooper
的用法:
这个工具使用起来很简单,首先直接可以使用 pip 安装:pip install pysnooper
使用时,只需要在每个函数前面添加装饰器即可。
给个简单例子看看就知道了,
import pysnooper
@pysnooper.snoop()
def removeDuplicates(nums):
"""
:type nums: List[int]
:rtype: int
"""
flag = 0
i=1
while i<len(nums):
if nums[i]==nums[i-1]:
flag+=1
i+=1
if flag>=2:
del nums[i-1]
i-=1
else:
i+=1
flag=0
return len(nums)
nums = [1,1,1,2]
print(removeDuplicates(nums))
添加装饰器后,运行代码就会输出对应函数的执行数据
Starting var:.. nums = [1, 1, 1, 2]
13:03:44.990194 call 11 def removeDuplicates(nums):
13:03:44.990695 line 16 flag = 0
New var:....... flag = 0
13:03:44.990695 line 17 i=1
New var:....... i = 1
13:03:44.990695 line 18 while i<len(nums):
13:03:44.990695 line 19 if nums[i]==nums[i-1]:
13:03:44.990695 line 20 flag+=1
Modified var:.. flag = 1
13:03:44.990695 line 21 i+=1
Modified var:.. i = 2
13:03:44.991193 line 22 if flag>=2:
13:03:44.991193 line 18 while i<len(nums):
13:03:44.991193 line 19 if nums[i]==nums[i-1]:
13:03:44.991193 line 20 flag+=1
Modified var:.. flag = 2
13:03:44.991193 line 21 i+=1
Modified var:.. i = 3
13:03:44.991193 line 22 if flag>=2:
13:03:44.991193 line 23 del nums[i-1]
Modified var:.. nums = [1, 1, 2]
13:03:44.991193 line 24 i-=1
Modified var:.. i = 2
13:03:44.991193 line 18 while i<len(nums):
13:03:44.991193 line 19 if nums[i]==nums[i-1]:
13:03:44.991193 line 26 i+=1
Modified var:.. i = 3
13:03:44.991693 line 27 flag=0
Modified var:.. flag = 0
13:03:44.991693 line 18 while i<len(nums):
13:03:44.991693 line 28 return len(nums)
13:03:44.991693 return 28 return len(nums)
Return value:.. 3
当然如果嫌弃这个直接输出内容还想保存日志记录的话,这个装饰器还几个可选参数,例如:
@pysnooper.snoop('log/file.log')
先创建好log目录,然后将日志输出到file文件中。
@pysnooper.snoop(prefix='removeDuplicates: ')
给调试的行加个前缀名便于辨识和定位,这个参数适用于如果同时调试多个函数使用,我这里的例子是使用了函数名称来作为前缀名,摘抄一点日志记录如下:
removeDuplicates: Starting var:.. nums = [1, 1, 1, 2]
removeDuplicates: 13:53:14.322036 call 11 def removeDuplicates(nums):
removeDuplicates: 13:53:14.323037 line 16 flag = 0
@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))
查看非本地变量
@pysnooper.snoop(depth=2)
显示函数中调用函数的snoop行,depth参数的取值范围是大于或等于1的正整数,在源码里有这样一个判断:assert self.depth >= 1
,当取小于1的值就会抛异常
作者:吃鱼益智
链接:https://www.jianshu.com/p/d26bf8950b59
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最新文章
- Android笔记——Android自定义控件
- 关于一道数据库例题的解析。为什么σ age>;22 (πS_ID,SCORE (SC) ) 选项是错的?
- 【centOS】账号管理
- adb 常用命令
- Word Ladder 未完成
- js继承---类继承法
- visualgo 数据结构与算法可视化工具
- 关于UNION ALL与 UNION 用法和区别
- 【转】python中常用第三方包os sys
- jQuery验证插件
- 用java编写一个微博登陆页面
- websocket flutter
- python3 安装 basemap 包(windows10)
- HTML、CSS知识点,面试开发都会需要--No.6 设置背景
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
- 在bat中执行sql,并配置windows计划任务,并隐藏命令窗口 (转)
- idea properties文件unicode码问题
- QML事件处理 八
- iOS 9音频应用播放音频之iOS 9音频播放进度
- 【离散化】【DFS】Gym - 101617H - Security Badges
热门文章
- .Nginx安装filebeat收集日志:
- 甘特图控件如何自定义绘图?DevExpress Winforms帮你忙
- python函数入参和返回值
- AtCoder Beginner Contest 116 C题 【题意:可以在任意区间【L,R】上加1,求通过最少加1次数得到题目给定的区间】】{思维好题}
- npm源管理
- 四十九. Zabbix报警机制 、 Zabbix进阶操作 、 监控案例
- 011_9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)
- LOJ2537. 「PKUWC2018」Minimax [DP,线段树合并]
- jsp显示当前系统时间
- Chisel-LLDB命令插件,让调试更Easy