专栏首页AI科技大本营的专栏优秀开发者必备技能包:Python调试器

优秀开发者必备技能包:Python调试器

作者 | Roky0429

来源 | Python空间(ID:Devtogether)

写在之前

不管是之前搞 acm 用 c/c++ 写算法还是后来用 Python 写代码,我发现在程序出现问题的时候,大多数人习惯性的用 print 函数打印变量值这种方法来试图找出问题的症结所在,这种查找问题的方式低效到让人只想删掉代码重新去写。我记得一些人问我问题的时候,我不止一次的推荐过让他们用单步调试去找代码中存在的问题,但是更多收获的是「什么是单步调试」这种疑问,其实单步调试就是,自己去 Google 好么?

究其源头还是很多人没有意识到「调试程序」的重要性,或者根本不知道这个概念。调试程序是所有开发人员必须具备的一项重要技能,它可以让我们一步一步的看到程序的运行过程,帮助我们准确的找到程序中的错误。当然这里我们还是以 Python 为例来说「调试程序」。

也许会有人说我现在就写一些短的代码,好像也不用这么麻烦的去调试程序。如果你只是准备写一辈子短代码,那你确实不用,但是如果你以后一步步的想去做项目了,随着代码量的增加,逻辑的复杂,如果你还是硬撑着用 print 去解决问题,那么恭喜你,你可能加班加到头发光光也不一定能找到问题在哪。所以我希望大家能在一开始就走在正确的道路上,只要稍微花点时间去学习就能掌握的技能为什么要当作视而不见呢?植发很贵的!

现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲的重点。今天主要是想给大家介绍一下 「Python调试器」,快速定位各种疑难杂症。

Python 调试器

这一部分主要就是想说两个 Python 调试器,分别是标准库自带的 pdb 和开源的 ipdb。

pdb

pdb 是 Python 自带的库,为 Python 提供了一种交互式的源码调试功能,包含当前调试器应有的功能,包括设置断点、单步调试、查看源码等。其实如果你之前学过 c/c++ 的话,你可能知道 gdb 这个命令行调试工具,如果你之前用过 gdb,那么恭喜你你可以直接用 pdb 了,因为这哥俩一个用法。如果你不知道 gdb 也没事,我们先来看一下 pdb 的部分调试命令(截图来自脚本之家):

这里有两种不同的方法来启动 Python 调试器,两种方法适用于不同的场景。一种是直接在命令行参数指定使用 pdb 模块启动 Python 文件,这种适合于代码文件较短的情况,将在代码的第一行启动 Python 调试器。具体如下所示(例如文件名是 test.py):

python -m pdb test.py

另一种是在 Python 代码中调用 pdb 模块的 set_trace 方法设置一个断点,当程序运行到此断点的时候,程序将会暂停执行并且打开 pdb 调试器,这种适合于代码文件较大的情况。具体如下所示:

import pdb

def get_sum(n):
   cnt = 0
   for i in range(n):
       pdb.set_trace()
       cnt += i
       print(cnt)

if __name__ == '__main__':
   get_sum(5)

启动 Python 调试器以后就可以使用上面截图中的调试命令进行程序的调试。比如在接下来的操作中,我们先使用 list 来查看我们的代码,然后使用 p 打印变量当前的取值,最后用 n 执行下一行 Python 代码:

ipdb

ipdb 是一个开源的 Python 调试器,其实它和 pdb 的接口是一样的。那既然一样的接口,那为啥还要设计个 ipdb 呢?黑格尔曾经说过「存在即合理」,ipdb 相比于 pdb 多了语法高亮,tab 自动补全等友好功能,在易用性方面做了很大的改进,这个感觉就和 Python 和 IPython 一样。

当然,ipdb 作为一个第三方库,在使用之前必然要先安装:

pip install ipdb

我们修改一下之前例子中的 test.py 文件,修改之后的代码如下:

import ipdb

def get_sum(n):
   cnt = 0
   for i in range(n):
       ipdb.set_trace()
       cnt += i
       print(cnt)

if __name__ == '__main__':
   get_sum(5)

具体的操作还是和上面的 pdb 的操作一样:

你看,上面带了点儿高亮,是不是顺眼了很多?还不赶紧去试试。

(本文为AI科技大本营转载文章,转载请联系原作者)

本文分享自微信公众号 - AI科技大本营(rgznai100)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣

    编者按:代码智能(code intelligence)目的是让计算机具备理解和生成代码的能力,并利用编程语言知识和上下文进行推理,支持代码检索、补全、翻译、纠错...

    AI科技大本营
  • Python 初学者进阶的九大技能

    Python是一种很棒的语言,语法简单,无需在代码中搜索分号。对于初学者来说,Python是入门最简单的语言之一。

    AI科技大本营
  • 资源 | 10x Python开发者必读:本月Python文章TOP 10

    翻译 | AI科技大本营 参与 | 刘畅 编辑 | Donna 【AI科技大本营导语】Medium热门博客Mybridge AI例行评出本月10篇有助于提升你职...

    AI科技大本营
  • Python 调试器,一个优秀开发人员的必备技能包。

    不管是之前搞 acm 用 c/c++ 写算法还是后来用 Python 写代码,我发现在程序出现问题的时候,大多数人习惯性的用 print 函数打印变量值这种方法...

    Rocky0429
  • 一种有效的Python初学者训练法&常用符号清单 | Python

    概述:从Github等渠道获得任何你可以找到的python代码,你应该具有足够的知识看懂代码但不一定明白代码的目的和功能。

    用户7623498
  • 零基础VB教程056期:出错处理和代码调试goto语句 on error语句

    其实可以利用goto的思想,可以构造一个循环语句,但是不建议使用goto构造循环,也不建议过多使用goto,因为会使得程序可读性变差

    刘金玉编程
  • 当陈述需求时间 > 写代码时间,我该怎么办?

    相信这种场景大家也都遇见过,有时候大家想,和你说这么啰里啰嗦,业务也不难,我自己就做了吧.之前我也是这样,一帮总是帮到底,大家讨论后,现在想想,这样不好~

    云时之间
  • 技术类公众号的福音:代码美颜神器!

    有时候就想简单分享个代码,看起来好看易读一点这里用到的给代码美颜的工具推荐给大家:

    量化投资与机器学习微信公众号
  • 关于软件开发你真正需要知道的几个事情

    我之所以写这篇文章是因为有一个朋友最近决定跻身软件工程行业。我的这位朋友聪明,精力充沛,品貌兼优,又善于学习:每个人都认为这样的人才必将有一番作为。但是,在踏出...

    用户1289394
  • Visual Studio 调试系列2 基本调试方法

    在 Visual Studio 上下文中,当调试应用时,这通常意味着你在附加了调试器的情况下(即在调试器模式下)运行应用程序。 执行此操作时,调试器在运行过程中...

    张传宁老师

扫码关注云+社区

领取腾讯云代金券