python--debug神器pysnooper
使用它你可以获得什么优势:
(1)无需用print就可以获得变量的值;
(2)以日志地形式进行保存,方便随时查看;
(3)可以根据需要,设置调用函数的深度;
(4)多个函数的日志,可以设置前缀进行标识;
1.安装
pip install pysnooper
2.官方代码
import pysnooper
@pysnooper.snoop()
def number_to_bits(number):
if number:
bits = []
while number:
number, remainder = divmod(number, 2)
bits.insert(0, remainder)
return bits
else:
return [0]
number_to_bits(6)

我们可以看到程序运行到哪一步, 以及到那一步时相关变量的值。
若果你不想追踪整个函数,你可以像这样使用:
def foo():
lst = []
for i in range(10):
lst.append(random.randrange(1, 1000)) with pysnooper.snoop():
lower = min(lst)
upper = max(lst)
mid = (lower + upper) / 2
print(lower, mid, upper)
foo()

查看一下其源代码,发现其具有以下参数:

- output参数。该参数指定函数运行过程中产生的中间结果的保存位置,若该值为空,则将中间结果输出到控制台。

- watch参数。该参数是vector类型, 因为在默认情况下,装饰器只跟踪局部变量,要跟踪非局部变量,则可以通过该字段来指定。默认值为空vector。

- watch_explode参数:展开显示对象的属性或者列表/字典的值。

- depth参数。该参数表示需要追踪的函数调用的深度。在很多时候,我们在函数中会调用其他函数,通过该参数就可以指定跟踪调用函数的深度。默认值为1。
- prefix参数。该参数用于指定该函数接口的中间结果前缀。当多个函数都使用的该装饰器后,会将这些函数调用的中间结果保存到一个文件中,此时就可以通过前缀过滤不同函数调用的中间结果。默认值为空字符串。
- thread_info参数,在多线程应用程序上,确定在输出中监听到哪个线程。
- custom_repr参数,PySnooper支持装饰生成器。它将自动将修饰符应用于所有方法。(不包括属性和其他特殊情况。)

- max_variable_length参数,默认情况下,变量和异常被截断为100个字符。
- nomarlize参数,删除所有与机器相关的数据(路径,时间戳,内存地址),以便与其他跟踪轻松进行比较。
其实,比较重要的就是前面几个参数。对于一般情况下也就够用了,接下来用几个小例子来看下效果。
@pysnooper.snoop()
def test(n):
if n==1:
return 1
if n==2:
return 2
return test(n-1)+test(n-2) test(4)


例子2:
@pysnooper.snoop("quick_sort.txt")
def quick_sort(a):
if len(a)<=1:
return a
tmp=a[0]
left = [i for i in a[1:] if i<=tmp]
right = [i for i in a[1:] if i > tmp]
return quick_sort(left)+[tmp]+quick_sort(right)
quick_sort([3,5,9,4,7,2,8])

输出比较长,就不显示全部的结果了。
例子3:
class Foo(object):
def __init__(self):
self.num1 = 0
self.num2 = 0
self.sum_value = 0 def add(self, num1, num2):
return num1 + num2
@pysnooper.snoop(output="debug.log", watch=("self.num1", "self.num2", "self.sum_value"),prefix="--foo--")
def multiplication(self, num1, num2):
self.num1 = num1
self.num2 = num2
sum_value = 0
for i in range(0, num1):
sum_value = self.add(sum_value, num2)
self.sum_value = sum_value
return sum_value foo = Foo()
foo.multiplication(3, 4)

注意前缀名字变了,以及全局变量的值。
python--debug神器pysnooper的更多相关文章
- python的debug神器PySnooper
同事给我推荐了这个调试神器,一直没工夫看,今天看了下. 原文链接: 史上最方便的Python Debug工具|腾讯技术说 体验了下,感觉最好的用法:1.优先逐行调试:2.一些复杂状态处理或者偶现的bu ...
- 极简Python DeBug工具——PySnooper
DeBug Python 代码的方式有很多种?比如: (1)设置断点 (2)print函数 (3)... 本文要介绍的是一个新开源的项目PySnooper ,只要给有疑问的代码加上装饰器,各种信息一目 ...
- Python Debug工具
最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print.那么该工具有哪些优点呢,如何使用该工具呢.本文就介绍该工具的优缺点和使用方式. 前言 ...
- Python 三大神器
Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...
- [django]python异步神器-celery
python异步神器celery https://segmentfault.com/a/1190000007780963
- python爬虫神器PyQuery的使用方法
你是否觉得 XPath 的用法多少有点晦涩难记呢? 你是否觉得 BeautifulSoup 的语法多少有些悭吝难懂呢? 你是否甚至还在苦苦研究正则表达式却因为少些了一个点而抓狂呢? 你是否已经有了一些 ...
- Python模块之pysnooper
一.简介 调试程序时,很多人喜欢直接用print来代替断点调试,而pysnooper模块比print更方便,以装饰器的形式存在 二.实验环境 操作系统:win10 python版本:python3.6 ...
- python三大神器===》装饰器
1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...
- 推荐一款最强Python自动化神器!不用写一行代码!
搞过自动化测试的小伙伴,相信都知道,在Web自动化测试中,有一款自动化测试神器工具: selenium.结合标准的WebDriver API来编写Python自动化脚本,可以实现解放双手,让脚本代替人 ...
随机推荐
- Spring Cloud zuul网关服务 一
上一篇进行Netflix Zuul 1.0 与 gateway的对比.今天来介绍一下 zuul的搭建及应用 Zuul 工程创建 工程创建 cloud-gateway-zuul.还是基于之前的工程 po ...
- 最近学到的ABTest知识
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 如果之前看过我文章的同学就知道我在工作中搞的是推送系 ...
- PhpStorm10和Apache24配置多项目开发环境
PhpStorm10和Apache24配置多项目开发环境 Apache配置 httpd.conf LoadModule vhost_alias_module modules/mod_vhost_ali ...
- node-批量上传文件
很多项目可能都会涉及到的业务是关于多文件上传的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量和分包(一次请求传多个文件),这样每次都会以实现功能来完成,但是 ...
- 【Maven学习笔记】mvn help:system 命令的说明
mvn help:system 命令的说明 笔者用得是windows 10 x64系统 下载了Maven3,正确配置了系统变量M2_HOME的值,并且添加到Path变量路径当中. 简单来说,Maven ...
- 从《国产凌凌漆》看到《头号玩家》,你就能全面了解5G
2019 年 9 月,移动.联通.电信5G套餐预约总和已突破 1000 万.2019 年 11 月,三大电信运营商将在全国范围内提供携号转网服务.2019 年内,移动将建立 5 万个 5G 基站,联通 ...
- 基于SkyWalking的分布式跟踪系统 - 异常告警
通过前面2篇文章我们搭建了SW的基础环境,监控了微服务,能了解所有服务的运行情况.但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角--监控告警,同时此篇也是SW系列的 ...
- numpy.array 中的运算
简单运算 现在有有个需求,给定一个数组,让数组中每一个数乘以2,怎么做呢 n = 10 L = [i for i in range(n)] L # [0, 1, 2, 3, 4, 5, 6, 7, 8 ...
- AutoCad 二次开发 .net 之创建Table
我使用了COM对象来在cad2018中创建table表格,需要的ObjectArx开发包可以在官网上下载,并且需要使用.netframework4.6的库才行. 项目里除了引用常规的Cad开发dll, ...
- 通俗易懂了解React生命周期
1.前言 学习React时,学习组件的生命周期是非常重要的,了解了组件的"从无到有再到无"所经历的各个状态,对日后写高性能的组件会有很大的帮助. 2.生命周期图 React的生命周 ...