前端的 Python 入门指南(六):调试方式和技巧对比

《前端的 Python 入门指南》系列文章:

  • (一):常用语法和关键字对比
  • (二):函数的定义、参数、作用域对比
  • (三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同
  • (四):参数传递方式对比 - 值与引用传递 vs 可变不可变数据
  • (五):面向对象特性之继承实现的方式对比 - 基于原型链和基于类各有什么优缺点

调试是编程中不可或缺的一部分,掌握高效的调试方法能让开发过程更加顺畅。对于前端开发者来说,JavaScript 的调试工具可能已经非常熟悉,比如 Chrome DevTools 的断点调试、console.log 输出等。而 Python 也提供了一套丰富的调试工具和方法,能够满足开发者在不同场景下的需求。

本文将对比 JavaScriptPython 的调试方式及技巧,帮助前端开发者在 Python 开发中快速找到调试的“感觉”。


1. 打印调试:console.log vs print

JavaScript 的 console.log

在 JavaScript 开发中,console.log 是最常用的调试方式之一,用于将变量、对象、运行状态输出到控制台。

const data = { key: "value" };
console.log("Debug data:", data);  // Debug data: { key: "value" }

优点

  • 快速、简便,适合定位简单问题。
  • 浏览器的开发者工具支持更高级的 console 方法,如 console.table, console.group

Python 的 print

Python 中的 print 是类似的调试方式,可以输出变量或运行状态。

data = {"key": "value"}
print("Debug data:", data)  # Debug data: {'key': 'value'}

优点

  • 简单易用,适合初学者和快速验证代码。
  • Python 的 f-string 提供了格式化输出的便利:
    value = 42
    print(f"Debug value: {value}")  # Debug value: 42
    

对比总结

  • 两者都非常简单,但 console.log 提供了一些更高级的功能(如分组、折叠输出),而 Python 的 print 倾向于直接、清晰的调试输出。

2. 断点调试:DevTools vs pdb

JavaScript 的断点调试

在前端开发中,浏览器开发者工具(DevTools) 提供了强大的断点调试功能,允许开发者在代码中设置断点,逐行查看变量的值和运行状态。

使用示例:
  1. 在 DevTools 中打开 Sources 面板。
  2. 找到需要调试的文件,点击行号设置断点。
  3. 切换到控制台,查看变量或执行表达式。
JavaScript 中的 debugger 语句:

也可以在代码中显式设置断点:

function add(a, b) {debugger;  // 浏览器会暂停在这一行return a + b;
}
add(2, 3);

Python 的断点调试(pdbbreakpoint

Python 提供了内置的调试工具 pdb(Python Debugger),功能类似于 DevTools,但是基于命令行的。

使用示例:
  1. 在代码中插入 breakpoint()import pdb; pdb.set_trace()
    def add(a, b):breakpoint()  # 启动调试器return a + badd(2, 3)
    
  2. 运行代码后,调试器会暂停在 breakpoint() 处。
  3. 输入调试命令,如:
    • n(next):执行下一行代码。
    • c(continue):继续运行程序。
    • p(print):打印变量值。

对比总结

特性JavaScript(DevTools)Python(pdb)
易用性图形界面,适合新手基于命令行,需要记住调试命令
功能支持断点、逐行调试、查看调用栈和变量支持断点、变量查看、动态修改代码
直观程度图形界面直观、交互友好命令行操作直观性稍差
适用场景前端开发,浏览器中调试 HTML/CSS/JS服务器端脚本或本地 Python 程序调试

3. 高级调试技巧

JavaScript 高级调试

  1. 条件断点
    在 DevTools 中右键点击断点,可以设置条件断点。例如,当变量 x > 10 时暂停:

    let x = 0;
    for (let i = 0; i < 20; i++) {x += i;// 条件断点:x > 10 时暂停
    }
    
  2. 性能调试
    使用 DevTools 的 Performance 面板分析代码运行性能,找出性能瓶颈。

  3. 监视变量变化
    在控制台中使用 watch 监视特定变量的值。


Python 高级调试

  1. 调试外部库
    使用 pdb.set_trace() 可以在第三方库的代码中插入断点,分析其运行行为。

  2. 集成开发环境(IDE)调试
    许多 Python IDE(如 PyCharm、VS Code)提供了图形化的断点调试功能,与 JavaScript 的 DevTools 类似。

  3. 调试异步代码
    使用 asynciopdb 结合,可以调试异步任务:

    import asyncioasync def main():breakpoint()  # 在这里设置断点print("Hello, Async!")await asyncio.sleep(1)asyncio.run(main())
    
  4. 日志调试
    使用 Python 的内置 logging 模块替代 print,可以更系统地记录调试信息。

    import logging
    logging.basicConfig(level=logging.DEBUG)
    logging.debug("Debug message")
    

4. 日志调试:控制台日志 vs logging

JavaScript 的日志调试

除了 console.log,JavaScript 还提供了其他日志方法:

  • console.warn:输出警告信息。
  • console.error:输出错误信息。
  • console.group:分组显示日志。
示例:
console.group("Debug Info");
console.log("Normal log");
console.warn("Warning log");
console.error("Error log");
console.groupEnd();

Python 的日志调试

Python 提供了强大的 logging 模块,支持多种日志级别和输出格式:

示例:
import logging
logging.basicConfig(level=logging.DEBUG)logging.debug("Debug message")
logging.info("Info message")
logging.warning("Warning message")
logging.error("Error message")

日志级别

  • DEBUG: 调试信息。
  • INFO: 普通运行信息。
  • WARNING: 警告信息。
  • ERROR: 错误信息。

5. 调试工具对比总结

特性JavaScriptPython
打印调试console.log, 支持分组、表格、折叠print, 使用简单,但无高级功能
断点调试DevTools 图形界面,交互直观基于命令行的 pdb,或使用 IDE 提供的图形界面
高级功能条件断点、性能调试、实时监控支持日志、异步调试、外部库调试
日志调试console.warn, console.errorlogging,支持多级日志管理

6. 总结与建议

对于前端开发者,调试 Python 的方式可能最初会显得不够直观,但随着深入了解,你会发现 Python 的调试工具同样高效且灵活。以下是一些建议:

  1. 入门阶段
    • 使用简单的 print 调试。
    • 在代码中插入 breakpoint() 逐步熟悉 Python 的调试模式。
  2. 进阶阶段
    • 学习并熟悉 pdb 的常用命令,快速定位问题。
    • 使用 logging 替代 print,更系统地记录和分析问题。
  3. 高级阶段
    • 在 IDE 中充分利用图形化断点调试功能。
    • 学习调试异步代码和外部库,提高调试复杂场景的能力。

掌握这些调试技巧(✿◕‿◕) ,你会发现 Python 的开发调试过程不仅高效,而且乐趣无穷!(•̀ᴗ•́)و

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

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

相关文章

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…

Elasticsearch Serverless 中的数据流自动分片

作者&#xff1a;来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中&#xff0c;我们根据索引负载自动为数据流配置最佳分片数量&#xff0c;从而使用户无需摆弄分片。 传统上&#xff0c;用户会更改数据流的分片配置&#xff0c;以处理各种工作负载并充分利用可用资源。…

TcpServer 服务器优化之后,加了多线程,对心跳包进行优化

TcpServer 服务器优化之后&#xff0c;加了多线程&#xff0c;对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…

python进阶-05-利用Selenium来实现动态爬虫

python进阶-05-利用Selenium来实现动态爬虫 一.说明 这是python进阶部分05&#xff0c;我们上一篇文章学习了Scrapy来爬取网站&#xff0c;但是很多网站需要登录才能爬取有用的信息&#xff0c;或者网站的静态部分是一个空壳&#xff0c;内容是js动态加载的,或者人机验证&…

CSS常用的尺寸单位

像素px 以屏幕上的一个点为单位&#xff0c;比较稳定和精确用的最多 em 以字体大小为参考&#xff0c;&#xff08;是自身字体大小的倍数&#xff09;当自身的字体大小改变时&#xff0c;em也会随着改变em * font-size px rem 以根元素 < html > 作为参考&#xff…

容器部署Prometheus+Grafana

一、Grafana介绍 Zabbix 和 Grafana 是两种流行的监控工具,它们在功能和用途上有所不同: Zabbix: Zabbix 是一个开源的监控解决方案,主要用于监控网络服务和应用程序。它包括了自己的数据存储解决方案,可以直接从监控的设备收集数据。Zabbix 提供了广泛的监控功能,包括但…

qt之插件编译

QtXlsxWriter sudo apt install qtbase5-private-dev git clone https://github.com/dbzhang800/QtXlsxWriter.git cd QtXlsxWriter/ qmake make -j6 sudo make install #将生成的lib 及 include copy至项目路径的lib 及include里项目配置&#xff1a; QT xlsxbluetoo…

Linux —— vim 编辑器

一、什么是vim vim是一个功能强大、高度可定制的文本编辑器。以下是对vim编辑器的具体介绍&#xff1a; 历史背景&#xff1a;vim最初由Bram Moolenaar在1991年开发&#xff0c;作为vi编辑器的增强版&#xff0c;增加了许多新的特性和改进。它继承了vi的基本编辑功能和键盘快捷…

高效率同步降压转换器 - YB2416D: 实现快速充电和高效能供电的利器

概述: YB2416是一款输入耐压超过40V&#xff0c;在4.5V~30V输入电压条件下正常工作&#xff0c;并且能够实现精确恒压以及恒流的同步降压型DC-DC转换器。 内部集成80m2的上管和40m2的下管&#xff0c;无需外部肖特基二极管&#xff0c;可连续输出3A电流。输出3A电流时系统转换…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道&#xff0c;Git是用来管理某一个仓库&#xff0c;那当一个项目用到了多个仓库时&#xff0c;怎么来同步管理这些仓库呢&#xff1f;这个时候就可以引入Repo管理。 Repo介绍 …

神经网络的起源与工作原理

神经网络起源&#xff1a;一个生物神经网络是由一组化学上相连或功能上相关的神经元组成。一个神经元可能与许多其他神经元相连&#xff0c;网络中的神经元和连接的总数可能很广泛。连接&#xff0c;称为突触&#xff0c;通常是从轴突到树突形成的&#xff0c;尽管树突和其他连…

Qwen2.5-7B-Instruct vLLM 部署调用

Qwen2.5-7B-Instruct vLLM 部署调用 vLLM 简介 vLLM 框架是一个高效的大语言模型推理和部署服务系统&#xff0c;具备以下特性&#xff1a; 高效的内存管理&#xff1a;通过 PagedAttention 算法&#xff0c;vLLM 实现了对 KV 缓存的高效管理&#xff0c;减少了内存浪费&…

解决 Mac(M1/M2)芯片,使用node 14版本

前言 nvm 在安装 Node.js v14.21.3 时&#xff0c;报错&#xff1a; nvm install 14 Downloading and installing node v14.21.3... Downloading https://nodejs.org/dist/v14.21.3/node-v14.21.3-darwin-arm64.tar.xz... curl: (56) The requested URL returned error: 404Bin…

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面

前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中&#xff0c;命令行使用还是不太方便的&#xff0c;因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…

车载ADB:让汽车更智能的桥梁

随着科技的不断进步&#xff0c;汽车行业也在迅速迈向智能化。车载Android系统&#xff08;通常称为Android Auto&#xff09;正在变得越来越流行&#xff0c;而Android Debug Bridge (ADB) 作为连接和调试这些系统的桥梁&#xff0c;也变得尤为重要。在本文中&#xff0c;我们…

【ETCD】【源码阅读】configurePeerListeners() 函数解析

configurePeerListeners 是 ETCD 的一个核心函数&#xff0c;用于为集群中节点之间的通信配置监听器&#xff08;Peer Listener&#xff09;。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。 函数签名 func configurePeerList…

uniapp改成用vue起项目

目的&#xff1a;让项目按照vue的打包流程跑流水线 1.按照uniapp官网教程执行 2.执行第二条命令时报错 ERROR Failed to get response from true/vue-cli-version-marker 3.解决方式 报错可能跟yarn有关&#xff0c;然后切换成npm 找到自己本地电脑的这个文件 按照截图修…

装饰器模式(Decorator Pattern)

装饰器模式&#xff08;Decorator Pattern&#xff09; 定义 装饰器模式是一种结构性设计模式&#xff0c;通过 动态组合对象 的方式&#xff0c;为对象添加额外功能&#xff0c;而无需修改原有类。 装饰器模式的核心思想 对象增强&#xff1a;在现有类的基础上动态添加功能&…

【SH】微信小程序调用EasyDL零门槛AI开发平台的图像分类研发笔记

文章目录 微信小程序字符串字符串模板字符串拼接 上传图片编写JS代码编写wxml代码编写wxss代码 GET请求测试编写测试代码域名不合法问题 GET和POST请求测试编写JS代码编写wxml代码编写wxss代码 效果展示 微信小程序字符串 字符串模板 这是ES6引入的特性&#xff0c;允许你通过…

【C#】int? , C# 中的可空类型(Nullable Types)

在 C# 中&#xff0c;问号&#xff08;?&#xff09;用于表示可空类型&#xff08;nullable types&#xff09;。在你的代码中&#xff0c;int? 表示的是可空的整数类型&#xff0c;也就是可以存储 int 类型的值&#xff0c;也可以存储 null。具体来说&#xff1a; int? 详…