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

       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)

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

 

要实时调试Python代码,可以使用以下方法之一: 1. 使用logging模块进行简单的打印日志。可以在代码中插入日志语句,如`logging.debug('Python debug')`,`logging.info('Python info')`等,然后在运行代码时设置日志级别,以便在控制台中实时查看日志信息。例如,可以在代码中添加一个`test_logging()`函数,并在运行代码时调用该函数。\[1\] 2. 使用pudb模块进行交互式调试。可以在代码中插入`import pudb; pu.db`语句,然后在需要调试的地方设置断点。运行代码时,当程序执行到断点处时,会进入pudb的交互式调试界面,可以逐行查看代码并检查变量的值。例如,可以在代码中定义一个`findinspt`函数,并在`if __name__ == "__main__":`下调用该函数。\[2\] 3. 使用pysnooper模块进行多线程调试。可以在代码中使用`@pysnooper.snoop(thread_info=True)`装饰器来装饰需要调试的函数,然后运行代码时,pysnooper会在每个线程启动和结束时打印相关信息。例如,可以定义一个`do_something`函数,并在`if __name__ == '__main__':`下创建多个线程并调用该函数。\[3\] 这些方法都可以帮助你实时调试Python代码,根据你的需求选择适合的方法即可。 #### 引用[.reference_title] - *1* *2* *3* [Python-调试(各种方式)](https://blog.csdn.net/weixin_45203607/article/details/127184077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值