python编程中有哪些方便的调试方法

news2025/1/30 16:30:45

大家好,给大家分享一下一个有趣的事情,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!

对于每个程序开发者来说,调试几乎是必备技能。常用Pycharm编辑器里的方法有Print大法、log大法,但缺少类似Matlab的变量区,给代码调试带来不便,特别是在有函数的情况下,变量无法实时查看火车采集器伪原创。


1、Python Console

在Pycharm编辑器里面有个Python Console,可以查看变量变化,但对于函数变量难调试。


2、PySnooper

安利一款非常好用的调试工具,它能在一些场景下,大幅度提高调试的效率, 那就是 PySnooper

2.1、快速安装

执行下面这些命令进行安装 PySnooper

pip install pysnooper

2.2、简单案例

下面这段代码,定义了一个 test 的函数,在里面生成一个 person 的字典变量,然后去更新它,最后返回。

import pysnooper

@pysnooper.snoop()def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    return person

def main():     author = test()

main()

输出结果

21:25:21.875841 call         5 def test():21:25:21.875841 line         6     person = {}New var:....... person = {}21:25:21.875841 line         7     person["name"] = "domi"Modified var:.. person = {'name': 'domi'}21:25:21.876840 line         8     person["age"] = 28Modified var:.. person = {'name': 'domi', 'age': 28}21:25:21.876840 line         9     person["gender"] = "male"Modified var:.. person = {'name': 'domi', 'age': 28, 'gender': 'male'}21:25:21.876840 line        10     return person21:25:21.876840 return      10     return personReturn value:.. {'name': 'domi', 'age': 28, 'gender': 'male'}Elapsed time: 00:00:00.000999

PySnooper 把函数运行的过程全部记录了下来,包括:

  • 代码的片段、行号等信息,以及每一行代码是何时调用的?

  • 函数内局部变量的值如何变化的?何时新增了变量,何时修改了变量。

  • 函数的返回值是什么?

  • 运行函数消耗了多少时间?

2.3、重定向到日志文件

@pysnooper.snoop() 不加任何参数时,会默认将调试的信息输出到标准输出。对于单次调试就能解决的 BUG ,这样没有什么问题,但是有一些 BUG 只有在特定的场景下才会出现,需要你把程序放在后面跑个一段时间才能复现。这种情况下,你可以将调试信息重定向输出到某一日志文件中,方便追溯排查。

@pysnooper.snoop(output='./debug.log')def test():

2.4、跟踪非局部变量值

PySnooper 是以函数为单位进行调试的,它默认只会跟踪函数体内的局部变量,若想跟踪全局变量,可以给 pysnooper.snoop() 加上 watch 参数

out = {"foo": "bar"}@pysnooper.snoop(watch=('out["foo"]'))def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    out["foo"] += 'test'    return person

2.5、设置跟踪函数的深度

当你使用 PySnooper 调试某个函数时,若该函数中还调用了其他函数,PySnooper 是不会傻傻的跟踪进去的。如果你想继续跟踪该函数中调用的其他函数,可以通过指定 depth 参数来设置跟踪深度(不指定的话默认为 1)。

@pysnooper.snoop()def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    c = test1()    return person

def test1():    a = 1    b = 2    return a + b

@pysnooper.snoop(depth=2)

2.6、设置调试日志的前缀

当你在使用 PySnooper 跟踪多个函数时,调试的日志会显得杂乱无章,不方便查看。在这种情况下,PySnooper 提供了一个参数,方便你为不同的函数设置不同的标志,方便你在查看日志时进行区分。

@pysnooper.snoop(output="./debug.log", prefix="test: ")def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    c = test1()    return person

@pysnooper.snoop(output="./debug.log", prefix="test1: ")def test1():    a = 1    b = 2    return a + b

2.7、支持多线程调试模式

PySnooper 同样支持多线程的调试,通过设置参数 thread_info=True,它就会在日志中打印出是在哪个线程对变量进行的修改。

@pysnooper.snoop(thread_info=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024浙大MBA/MEM/MPA四个月冲刺备考策略

近期收到很多考生的咨询:距离联考就仅剩四个多月的时间,这个管理类联考的难度如何?主要考些什么内容?现在才开始备考还有希望上岸浙大吗?是不是要等到明年在开始备考比较合适?那么今天在这里小立老师就跟大…

《凤凰架构》第二章——访问远程服务

前言 这章挺难的,感觉离我比较远,不太好懂,简单记录吧。 这章主要讲访问远程服务,主要对比了RPC和REST的区别,可以结合知乎上的文章《既然有 HTTP 请求,为什么还要用 RPC 调用?》 这篇文章进行…

电脑提示丢失(或找不到)msvcp120.dll解决办法

msvcp140.dll是Microsoft Visual C Redistributable的一部分,它是Windows操作系统中的一个动态链接库文件。这个文件包含了许多C标准库函数的实现,对于一些依赖C标准库的应用程序来说,msvcp140.dll是非常重要的。msvcp140.dll的主要用途是提供…

学计算机只能是赛博打灰人?转嵌入式你就已经稳了!

最近有很多大一新生问我,自己不小心被录到计算机专业了,是不是以后最好就只能大厂996,做赛博打灰人,然后三十五岁直接被优化呢? 我说,你这种人正是嵌入式最需要的人,进入嵌入式行业不仅天然具有…

使用EasyExcel实现Excel表格的导入导出

使用EasyExcel实现Excel表格的导入导出 文章目录 使用EasyExcel实现Excel表格的导入导出1.集成easyExcel2.简单导出示例实体与excel列的映射导出excel的代码 3.Excel复杂表头导出与实体的映射导出代码 3.Excel导入 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们…

[uni-app] uview封装Popup组件,处理props及v-model的传值问题

文章目录 需求及效果遇到的问题解决的办法偷懒的写法 需求及效果 uView(1.x版本)中, 有Pop弹出层的组件, 现在有个需求是,进行简单封装,有些通用的设置不想每次都写(比如 :mask-custom-style"{background: rgba(0, 0, 0, 0.7)}"这种) 然后内部内容交给插槽去自己随…

js fetch请求中断的几种方式

1、通过AbortController 这是官方标准手段,真正意义的阻止请求(不支持ie) 后端接口设置的两秒返回数据 function myFetch() {const controller new AbortController();const signal controller.signal;fetch(http://localhost:3000/aaa/…

学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯

文章目录 第六集(下)课后练习解答:SOS求救灯光编写求救信号原理冲哥代码及解析分模块设计:math.h:math.c:while主程序部分 按键点灯(下)1.按键的原理Tips:按键消抖 2.按键的代码实现…

【java安全】Log4j反序列化漏洞

文章目录 【java安全】Log4j反序列化漏洞关于Apache Log4j漏洞成因CVE-2017-5645漏洞版本复现环境漏洞复现漏洞分析 CVE-2019-17571漏洞版本漏洞复现漏洞分析 参考 【java安全】Log4j反序列化漏洞 关于Apache Log4j Log4j是Apache的开源项目,可以实现对System.out…

【新书介绍】数字图像处理——基于OpenCV-Python

新书介绍:《数字图像处理——基于OpenCV-Python》 入手图像处理的小伙伴,应该先学数字图像处理课程,还是直接上手OpenCV呢?《数字图像处理——基于OpenCV-Python》的作者,也曾面临同样的困扰。作者的选择是一边学习理论…

《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的例9说明

《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的定理3的引申 定理3 带有i个内点的m叉树含有nmi1个顶点 见本人博文 内点定义不同的讨论 如果对于一个m叉正则树,即任意分支节点的儿子恰好有m个&am…

linux第三阶段--第三方软件(一)MySQL的概述和二进制安装(官网版)

MySQL介绍及安装 一、MySQL概述 DB2 POSTGRE-SQL 1、关系型数据库与非关系型数据库 RDBMS(relational database management system),既关系型数据库管理系统。 简单来说,关系型数据库,是指采用了二维表格来组织数…

成为项目经理需要哪些条件或证书?

首先,要成为一个项目经理,需要具备以下几种管理能力,这样公司才会信任你并把项目交给你。 1.人员开发能力 1.作为项目经理,需要创造一个学习的环境,让员工从工作中、从所经历或观察到的情况中获取知识。例如&#xf…

dB(分贝)定义及其应用(音量 dB dBA 计算 调整)

一、dB的诞生背景 dB是英文“decibel”的简写,其中,deci表示十分之一,Bel表示“贝”。Decibel,分贝就是十分之一贝。“贝”是“贝尔”的简称,是以杰出科学家Alexander Graham Bell的名字来命名的单位。贝尔在1876年获…

【3Ds Max】图形合并命令的简单使用

示例(将文字设置在球体上) 1. 首先这里创建一个球体和一个文本 2. 选中球体,在复合对象中点击图形合并按钮 点击“拾取图形”按钮,然后选中文本,此时可以看到球体上已经投射出文本 3. 接下来是一些常用参数的介绍 当…

必看!这篇破万字!国字头研究所,就业无敌!

我不进行报考院校的推荐,但我会做充足客观的数据分析,帮助大家进行报考前的千层博弈。这个择校分析专题会为大家结合:初试复试占比、复试录取规则(是否公平)、往年录取录取名单、招生人数、分数线、专业课难度等进行分…

fastapi发布web配置页面

fastapi发布web配置页面 FastAPI 是一个基于 Python 的快速 Web 开发框架,它提供了许多功能来简化 Web 开发过程。其中一个重要的功能是能够轻松地创建 API 文档页面。 在 FastAPI 中,可以使用 OpenAPI 和 Swagger 来创建 API 文档页面。下面是一个简单…

OLED透明屏与传统显示屏的区别:探索未来视觉体验的新里程碑

OLED透明屏作为一种新兴的显示技术,与传统显示屏相比,具有许多独特的特点和优势。 那么,在这篇文章中,尼伽便通过比较OLED透明屏和传统显示屏的区别,包括透明性、对比度、色彩表现力、节能环保等方面,为读…

聚观早报|京东称在技术投入没有止境;木蚁机器人完成B2轮融资

【聚观365】8月18日消息 京东零售CEO表示在技术上投入没有止境 木蚁机器人完成B2轮超亿元融资 耐能推出AI芯片KL730 三星电子泰勒晶圆厂首家客户是AI半导体厂商 韩国新能源汽车7月出口额同比大增36% 京东零售CEO表示在技术上投入没有止境 近日,京东零售CEO辛利…

​Kubernetes的演变:从etcd到分布式SQL的过渡

DevRel领域专家Denis Magda表示,他偶然发现了一篇解释如何用PostgreSQL无缝替换etcd的文章。该文章指出,Kine项目作为外部etcd端点,可以将Kubernetes etcd请求转换为底层关系数据库的SQL查询。 受到这种方法的启发,Magda决定进一步…