PySnooper:非常好用的python代码调试帮助工具!

    xiaoxiao2024-10-26  82

           PySnooper是一个给平民用的调试器,因为它是完全免费的!使用pysnooper可以完整的输出函数每一行代码中的变量的值,供我们去观察。github网址:PySnooper - Never use print for debugging again

    1.示例

           下面这个函数的功能是,通过返回一个位列表将数字转换为二进制。 然后通过添加@pysnooper.snoop() 装饰器来追踪它的每一行的变量的值:

    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)

    stderr的输出是:

    Starting var:.. number = 6 15:29:11.327032 call 4 def number_to_bits(number): 15:29:11.327032 line 5 if number: 15:29:11.327032 line 6 bits = [] New var:....... bits = [] 15:29:11.327032 line 7 while number: 15:29:11.327032 line 8 number, remainder = divmod(number, 2) New var:....... remainder = 0 Modified var:.. number = 3 15:29:11.327032 line 9 bits.insert(0, remainder) Modified var:.. bits = [0] 15:29:11.327032 line 7 while number: 15:29:11.327032 line 8 number, remainder = divmod(number, 2) Modified var:.. number = 1 Modified var:.. remainder = 1 15:29:11.327032 line 9 bits.insert(0, remainder) Modified var:.. bits = [1, 0] 15:29:11.327032 line 7 while number: 15:29:11.327032 line 8 number, remainder = divmod(number, 2) Modified var:.. number = 0 15:29:11.327032 line 9 bits.insert(0, remainder) Modified var:.. bits = [1, 1, 0] 15:29:11.327032 line 7 while number: 15:29:11.327032 line 10 return bits 15:29:11.327032 return 10 return bits Return value:.. [1, 1, 0]

    2.指定输出内容:

    如果不想跟踪整个函数,可以将自己想要跟踪的内容编写在with块中,如下所示,输出lst列表中的最大值、最小值和中间值:

    import pysnooper import random 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()

    输出如下:

    New var:....... lst = [871, 383, 481, 214, 863, 362, 405, 452, 36, 325] New var:....... i = 9 New var:....... lst = [681, 267, 74, 832, 284, 678, ...] 09:37:35.881721 line 10 lower = min(lst) New var:....... lower = 74 09:37:35.882137 line 11 upper = max(lst) New var:....... upper = 832 09:37:35.882304 line 12 mid = (lower + upper) / 2 74 453.0 832 New var:....... mid = 453.0 09:37:35.882486 line 13 print(lower, mid, upper) 36 453.5 871

    3.如果跟踪内容太长,可以将其输出到本地日志文件中

    @pysnooper.snoop('/path/to/logfile/file.log')

    4.查看一些非局部变量的表达式的值

    @pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))

    或者查看非局部变量的所有属性列表:

    @pysnooper.snoop(watch_explode=('foo', 'self'))

    5.跟踪函数中调用的函数

    使用depth来设置跟踪的函数调用深度:

    @pysnooper.snoop(depth=2)

    6.设置一个前缀名,将更容易定位和找到snoop行

    @pysnooper.snoop(prefix='ZZZ ')

    7.在多线程应用程序上识别哪个线程在输出中被跟踪

    @pysnooper.snoop(thread_info=True)

    这一项没看懂,有懂的大神,帮忙留言解释一下!

     

    最新回复(0)