按关键词阅读:
@pysnooper.snoop(watch_explode=('foo', 'bar'))
def demo_func:
...
2.3 设置跟踪函数的深度当你使用 PySnooper 调试某个函数时 , 若该函数中还调用了其他函数 , PySnooper 是不会傻傻的跟踪进去的 。 如果你想继续跟踪该函数中调用的其他函数 , 可以通过指定 depth
参数来设置跟踪深度(不指定的话默认为 1) 。
@pysnooper.snoop(depth=2)
def demo_func:
...
2.4 设置调试日志的前缀当你在使用 PySnooper 跟踪多个函数时 , 调试的日志会显得杂乱无章 , 不方便查看 。 在这种情况下 , PySnooper 提供了一个参数 , 方便你为不同的函数设置不同的标志 , 方便你在查看日志时进行区分 。
@pysnooper.snoop(output="/var/log/debug.log", prefix="demo_func: ")
def demo_func:
...
效果如下
文章插图
2.5 设置最大的输出长度默认情况下 , PySnooper 输出的变量和异常信息 , 如果超过 100 个字符 , 被会截断为 100 个字符 。 当然你也可以通过指定参数 进行修改
@pysnooper.snoop(max_variable_length=200)
def demo_func:
...
您也可以使用max_variable_length=None它从不截断它们 。
@pysnooper.snoop(max_variable_length=None)
def demo_func:
...
2.6 支持多线程调试模式PySnooper 同样支持多线程的调试 , 通过设置参数 thread_info=True
, 它就会在日志中打印出是在哪个线程对变量进行的修改 。
@pysnooper.snoop(thread_info=True)
def demo_func:
...
效果如下
文章插图
2.7 自定义对象的格式输出pysnooper.snoop
函数有一个参数是custom_repr
, 它接收一个元组对象 。 在这个元组里 , 你可以指定特定类型的对象以特定格式进行输出 。 这边我举个例子 。 假如我要跟踪 person 这个 Person 类型的对象 , 由于它不是常规的 Python 基础类型 , PySnooper 是无法正常输出它的信息的 。 因此我在pysnooper.snoop
函数中设置了custom_repr
参数 , 该参数的第一个元素为 Person , 第二个元素为print_persion_obj
函数 。 PySnooper 在打印对象的调试信息时 , 会逐个判断它是否是 Person 类型的对象 , 若是 , 就将该对象传入print_persion_obj
函数中 , 由该函数来决定如何显示这个对象的信息 。
class Person:pass
def print_person_obj(obj):
return f""
@pysnooper.snoop(custom_repr=(Person, print_person_obj))
def demo_func:
...
完整的代码如下
import pysnooper
class Person:pass
def print_person_obj(obj):
return f""
@pysnooper.snoop(custom_repr=(Person, print_person_obj))
def demo_func:
person = Person
person.name = "写代码的明哥"
person.age = 27
person.gender = "male"
return person
def main:
profile = demo_func
main
运行一下 , 观察一下效果 。
文章插图
如果你要自定义格式输出的有很多个类型 , 那么 custom_repr
参数的值可以这么写
@pysnooper.snoop(custom_repr=((Person, print_person_obj), (numpy.ndarray, print_ndarray)))
def demo_func:
...
还有一点我提醒一下 , 元组的第一个元素可以是类型(如类名Person 或者其他基础类型 list等) , 也可以是一个判断对象类型的函数 。 也就是说 , 下面三种写法是等价的 。
# 【第一种写法】
@pysnooper.snoop(custom_repr=(Person, print_persion_obj))
def demo_func:
...
# 【第二种写法】
def is_persion_obj(obj):
return isinstance(obj, Person)
@pysnooper.snoop(custom_repr=(is_persion_obj, print_persion_obj))
def demo_func:
...
# 【第三种写法】
@pysnooper.snoop(custom_repr=(lambda obj: isinstance(obj, Person), print_persion_obj))
def demo_func:
...
以上就是今天给大家介绍的一款调试神器(PySnooper
) 的详细使用手册 , 是不是觉得还不错?
如果你还有其他关于调试的技巧 , 可以留言区分享出来 , 一起学习一下~
— 完—
福利
入门Python的最强三件套《ThinkPython》、《简明Python教程》、《Python进阶》的PDF电子版已打包提供给大家 , 关注下方公众号 , 在后台回复关键字「P3」即可获取 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2J562020.html
标题:求你了,别再用 print 调试代码了( 二 )