【聚看点】python自产调试工具pdb的使用
以LeetCode 1. 两数之和 为例
题目
(资料图片仅供参考)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6输出:[1,2]示例 3:输入:nums = [3,3], target = 6输出:[0,1]提示: # 下面的这些不考虑2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109只会存在一个有效答案 进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
我写个错误的代码demo_twosum.py
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i,v in enumerate(nums): if target-v in nums: return [i,nums.index(target-v)]
对于以下cases,应返回[1,2],实际返回[0,0]
输入:nums = [3,2,4], target = 6
因为题目中有要求:数组中同一个元素在答案里不能重复出现
我们来看看如何用pdb来调试这段代码
from typing import Listclass Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i,v in enumerate(nums): if target-v in nums: return [i,nums.index(target-v)]nums = [3,2,4]target = 6solution = Solution().twoSum(nums,target)print(solution)
你可以执行
python -m pdb demo_twosum.py
执行界面大致如下
# python -m pdb demo_twosum.py> demo_twosum.py(1)()-> from typing import List
你还可以在代码中加breakpoint()
if target-v in nums: breakpoint() # 加在你要调试的代码附近 Line 7 return [i,nums.index(target-v)]
运行你的代码提示如下
D:\Python39\python.exe demo_twosum.py> demo_twosum.py(7)twoSum()-> return [i,nums.index(target-v)](Pdb)
常用的调试命令典型的操作
D:\pythonProject\外部公开课\当前公开课>python -m pdb demo_twosum.py> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(1)()-> from typing import List(Pdb) b 5Breakpoint 1 at d:\pythonproject\外部公开课\当前公开课\demo_twosum.py:5(Pdb) c> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(5)twoSum()-> if target-v in nums:(Pdb) w d:\python39\lib\bdb.py(580)run()-> exec(cmd, globals, locals) (1)() d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(9)()-> solution = Solution().twoSum(nums,target)> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(5)twoSum()-> if target-v in nums:(Pdb) p i0(Pdb) p target6(Pdb) p v3(Pdb) r--Return--> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(6)twoSum()->[0, 0]-> return [i,nums.index(target-v)](Pdb) l 1 from typing import List 2 class Solution: 3 def twoSum(self, nums: List[int], target: int) -> List[int]: 4 for i,v in enumerate(nums): 5 B if target-v in nums: 6 -> return [i,nums.index(target-v)] 7 nums = [3,2,4] 8 target = 6 9 solution = Solution().twoSum(nums,target) 10 print(solution)[EOF](Pdb) p [i,nums.index(target-v)][0, 0](Pdb) q
所以,这是在做啥?
逐行解释
第1行
D:\pythonProject>python -m pdb demo_twosum.py> d:\pythonproject\demo_twosum.py(1)()-> from typing import List
当前文件绝对路径 d:\pythonproject\demo_twosum.py
处于第一行 (1)
是个module
第一行的内容 -> from typing import List# 这是你即将运行的代码
参考上面breakpoint()
的方式,你会发现显示的是你打了断点下面的那一行代码。
-> return [i,nums.index(target-v)]
第2行
(Pdb) b 5Breakpoint 1 at d:\pythonproject\外部公开课\当前公开课\demo_twosum.py:5
在第5行设置一个断点如果就写一个b(break),那就是列出当前所有的断点对应的clear 断点编号
就可以取消该断点第3行
(Pdb) c> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(5)twoSum()-> if target-v in nums:
运行到设置的断点处第4行
(Pdb) w d:\python39\lib\bdb.py(580)run()-> exec(cmd, globals, locals) (1)() d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(9)()-> solution = Solution().twoSum(nums,target)> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(5)twoSum()-> if target-v in nums:
查看当前的调用栈是不是有点像堆栈的打印第5行
(Pdb) p i0(Pdb) p target6(Pdb) p v3
打印当前的变量
pp则是类似于pprint,美化输出
注意p可以打印任意有效的python表达式
值得一提的是,你甚至可以改变此时的程序(print做不到了)
# 比如 任意的python 语句v = 3
第6行
(Pdb) r--Return--> d:\pythonproject\外部公开课\当前公开课\demo_twosum.py(6)twoSum()->[0, 0]-> return [i,nums.index(target-v)]
运行到返回第7行
(Pdb) l
打印当前位置前后11行代码再输入一个l,则往下再翻11行l.
可以列出当前行周围的 11 行第8行:打印[i,nums.index(target-v)]
,发现是[0,0]
第9行:q,退出
附录 pdb命令全解h(elp) [command]
不带参数时,显示可用的命令列表。参数为 command时,打印有关该命令的帮助。help pdb
显示完整文档(即 pdb
模块的文档字符串)。由于 command参数必须是标识符,因此要获取 !
的帮助必须输入 help exec
。
w(here)
打印堆栈回溯,最新一帧在底部。有一个箭头指向当前帧,该帧决定了大多数命令的上下文。
d(own) [count]
在堆栈回溯中,将当前帧向下移动 count级(默认为 1 级,移向更新的帧)。
u(p) [count]
在堆栈回溯中,将当前帧向上移动 count级(默认为 1 级,移向更老的帧)。
b(reak) [([filename:]lineno | function) [, condition]]
如果带有 lineno参数,则在当前文件相应行处设置一个断点。如果带有 function参数,则在该函数的第一条可执行语句处设置一个断点。行号可以加上文件名和冒号作为前缀,以在另一个文件(可能是尚未加载的文件)中设置一个断点。另一个文件将在 sys.path
范围内搜索。请注意,每个断点都分配有一个编号,其他所有断点命令都引用该编号。如果第二个参数存在,它应该是一个表达式,且它的计算值为 true 时断点才起作用。如果不带参数执行,将列出所有中断,包括每个断点、命中该断点的次数、当前的忽略次数以及关联的条件(如果有)。
tbreak [([filename:]lineno | function) [, condition]]
临时断点,在第一次命中时会自动删除。它的参数与 break
相同。
cl(ear) [filename:lineno | bpnumber ...]
如果参数是 filename:lineno,则清除此行上的所有断点。如果参数是空格分隔的断点编号列表,则清除这些断点。如果不带参数,则清除所有断点(但会先提示确认)。
disable [bpnumber ...]
禁用断点,断点以空格分隔的断点编号列表给出。禁用断点表示它不会导致程序停止执行,但是与清除断点不同,禁用的断点将保留在断点列表中并且可以(重新)启用。
enable [bpnumber ...]
启用指定的断点。
ignore bpnumber [count]
为指定的断点编号设置忽略次数。如果省略 count,则忽略次数将设置为 0。忽略次数为 0 时断点将变为活动状态。如果为非零值,在每次达到断点,且断点未禁用,且关联条件计算值为 true 的情况下,该忽略次数会递减。
condition bpnumber [condition]
为断点设置一个新 condition,它是一个表达式,且它的计算值为 true 时断点才起作用。如果没有给出 condition,则删除现有条件,也就是将断点设为无条件。
commands [bpnumber]
为编号是 bpnumber的断点指定一系列命令。命令内容将显示在后续的几行中。输入仅包含 end
的行来结束命令列表。举个例子:(Pdb) commands 1 (com) p some_variable (com) end (Pdb)
要删除断点上的所有命令,请输入 commands
并立即以 end
结尾,也就是不指定任何命令。如果不带 bpnumber参数,commands
作用于最后一个被设置的断点。可以为断点指定命令来重新启动程序。只需使用 continue
或 step
命令或其他可以继续运行程序的命令。如果指定了某个继续运行程序的命令(目前包括 continue
, step
, next
, return
, jump
, quit
及它们的缩写)将终止命令列表(就像该命令后紧跟着 end)。因为在任何时候继续运行下去(即使是简单的 next 或 step),都可能会遇到另一个断点,该断点可能具有自己的命令列表,这导致要执行的列表含糊不清。如果在命令列表中加入 "silent" 命令,那么在该断点处停下时就不会打印常规信息。如果希望断点打印特定信息后继续运行,这可能是理想的。如果没有其他命令来打印一些信息,则看不到已达到断点的迹象。
s(tep)
运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下。
n(ext)
继续运行,直到运行到当前函数的下一行,或当前函数返回为止。( next
和 step
之间的区别在于,step
进入被调用函数内部并停止,而 next
(几乎)全速运行被调用函数,仅在当前函数的下一行停止。)
unt(il) [lineno]
如果不带参数,则继续运行,直到行号比当前行大时停止。如果带有行号,则继续运行,直到行号大于或等于该行号时停止。在这两种情况下,当前帧返回时也将停止。在 3.2 版更改:允许明确给定行号。
r(eturn)
继续运行,直到当前函数返回。
c(ont(inue))
继续运行,仅在遇到断点时停止。
j(ump) lineno
设置即将运行的下一行。仅可用于堆栈最底部的帧。它可以往回跳来再次运行代码,也可以往前跳来跳过不想运行的代码。需要注意的是,不是所有的跳转都是允许的 -- 例如,不能跳转到 for
循环的中间或跳出 finally
子句。
l(ist) [first[, last]]
列出当前文件的源代码。如果不带参数,则列出当前行周围的 11 行,或继续前一个列表。如果用 .
作为参数,则列出当前行周围的 11 行。如果带有一个参数,则列出那一行周围的 11 行。如果带有两个参数,则列出所给的范围中的代码;如果第二个参数小于第一个参数,则将其解释为列出行数的计数。当前帧中的当前行用 ->
标记。如果正在调试异常,且最早抛出或传递该异常的行不是当前行,则那一行用 >>
标记。3.2 新版功能:>>
标记。
ll | longlist
列出当前函数或帧的所有源代码。相关行的标记与 list
相同。3.2 新版功能.
a(rgs)
打印当前函数的参数列表。
p expression
在当前上下文中运行 expression并打印它的值。注解 print()
也可以使用,但它不是一个调试器命令 --- 它执行 Python print()
函数。
pp expression
与 p
命令类似,但表达式的值使用 pprint
模块美观地打印。
whatis expression
打印 expression的类型。
source expression
尝试获取给定对象的源代码并显示出来。3.2 新版功能.
display [expression]
如果表达式的值发生改变则显示它的值,每次将停止执行当前帧。不带表达式则列出当前帧的所有显示表达式。3.2 新版功能.
undisplay [expression]
不再显示当前帧中的表达式。 不带表达式则清除当前帧的所有显示表达式。3.2 新版功能.
interact
启动一个交互式解释器(使用 code
模块),它的全局命名空间将包含当前作用域中的所有(全局和局部)名称。3.2 新版功能.
alias [name [command]]
创建一个标识为 name的别名来执行 command。 执行的命令 不可加上引号。 可替换形参可通过 %1
, %2
等来标示,而 %*
会被所有形参所替换。 如果没有给出命令,则会显示 name的当前别名。 如果没有给出参数,则会列出所有别名。别名允许嵌套并可包含能在 pdb 提示符下合法输入的任何内容。 请注意内部 pdb 命令 可以被别名所覆盖。 这样的命令将被隐藏直到别名被移除。 别名会递归地应用到命令行的第一个单词;行内的其他单词不会受影响。作为示例,这里列出了两个有用的别名(特别适合放在 .pdbrc
文件中):# Print instance variables (usage "pi classInst") alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k]) # Print instance variables in self alias ps pi self
unalias name
删除指定的别名。
! statement
在当前堆栈帧的上下文中执行 (单行) statement。 感叹号可以被省略,除非语句的第一个单词与调试器命令重名。 要设置全局变量,你可以在同一行上为赋值命令添加前缀的 global
语句,例如:(Pdb) global list_options; list_options = ["-l"] (Pdb)
run [args ...]
restart [args ...]
重启被调试的 Python 程序。 如果提供了参数,它会用 shlex
来拆分且拆分结果将被用作新的 sys.argv
。 历史、中断点、动作和调试器选项将被保留。 restart
是 run
的一个别名。
q(uit)
退出调试器。 被执行的程序将被中止。
debug code
进入一个对代码参数执行步进的递归调试器(该参数是在当前环境中执行的任意表达式或语句)。
retval
打印函数最后一次返回的返回值。
标签:
推荐文章
- 【聚看点】python自产调试工具pdb的使用
- 联机生存建造游戏《虚空列车》将于5月10日登陆Steam-当前热讯
- 环球即时:游客坐车八小时诱发静脉血栓,到了杭州还没看西湖先进医院
- 每日热点:“狗爬式”过悬崖:“野生景点”就可不顾安全?
- 烟台市福山区清洋街道中心幼儿园开展劳动节主题教育活动 即时
- 《崩坏星穹铁道》希儿零氪怎么搭配?希儿零氪搭配方案 视焦点讯
- 焦点!去缅甸旅游注意事项 缅甸出入境注意事项
- 全球信息:工商银行筑梦中华金条50克价格今天多少一克(2023年05月04日)
- 【推荐:】试管婴儿需要多少钱?如何提高试管婴儿的成功率?
- 每日短讯:旅游市场高开稳走
- 欧迈机械2022年净利1711.82万 同比增加44.06% 生化行业对搅拌设备需求暴增
- 口腔诊所卫生不合格 现场收到监督意见书
- 全球聚焦:中来、赛伍、福斯特、明冠、乐凯: 光伏背板最新营收排名出炉!
- 焦点短讯!友阿股份(002277):宁波欧派亿奢汇出表 1Q23营收同降43.2%
- 天风证券给予湘油泵买入评级,Q1盈利能力持续修复,混动市场快速发展有望打开公司成长空间
- 在“躺平后起立互助联盟”小组里 1.8万网友相互鼓舞-全球今头条
- 全球微资讯!洽洽食品一季度营收净利双下滑 “冲百”战略开局不利
- 2023Q1全球动力电池市占率 宁德时代、比亚迪稳坐前二
- 王朝冠军版全系亮相兰州五一国际车展
- 天天热讯:信访复核申请书成功范文(合集13篇)
- 每日资讯:喝这个茶饮方一个月,调血压、降血脂、尿酸,连脂肪肝也没了
- 华创家电丨光峰科技车载业务逐渐落地,业绩拐点可期|每日信息
- 俄方:有无人机袭击克里姆林宫 莫斯科已禁飞无人机-天天亮点
- 核心业务营收下滑拖累业绩 同方股份去年亏损收窄至7.72亿元-天天热点
- 驻香港部队安排官兵和来队亲属参与“五一”升国旗典礼详细介绍 天天消息
- 环球速读:山东省成立聊城鲁西化工“5·1”爆炸着火事故调查组
- 美国对冲基金创始人:美联储错误做法致银行业危机持续发酵-环球观察
- 【全球独家】贵州台江:翁你河畔上演万人苗歌对唱
- 青山区:小长假聚拢消费市场烟火气
- 华友钴业:拟在韩国合作设立电池材料硫酸镍精炼及前驱体生产工厂
- 泽连斯基:绝对是个糟糕的故事
- 人艺王雷加戏惹怒黄轩!曾霸凌陈晓内涵陈宝国,这位飞天视帝的真面目太吓人!
- 世界头条:宋雕白玉凤纹龙柄花式碗
- 资讯:1587套房源可选!瑞安电子房票来了,拆迁户笑了…
- 周深调侃音乐节造型:“很开心额头见到大家”_环球热资讯
- 环球速看:返杭列车上一车厢孩子都在赶作业 假期余额不足!
- 世界今热点:王传福的40条思考:一切“技术壁垒”都是纸老虎
- 十大热门行业逐个看·计算机篇丨TMT火爆的背后:业绩普遍不及预期
- 班第达召_关于班第达召介绍|当前报道
- 不认同史航回应!五名受害者发布联合声明,要求公开道歉
- 全球微资讯!此情可待已惘然是什么意思_此情可待成追忆只是当时已惘然是什么意思?
- 天天播报:【青岛】情况通报:已立案调查!
- “五一”假期最热景区出炉!全国热度前三南京占了俩_世界视讯
- 腾讯QQ音乐App 9.0内测:全新界面改版 智能升级
- 乡音网是啥意思是什么_乡音网
- 当前资讯!议会内阁制和议会共和制的区别 议会内阁制
- 影楼培训游戏_影楼培训 全球焦点
- 天天观焦点:日接待游客3万人次 铜官窑古镇单日入园人数破创历史新高
- 易大宗(01733)将于7月6日派发末期股息每股0.084港元_每日视讯
- 天天热点!丽江古城人流如织 感受独特纳西文化魅力
- 互联网养老的可行性分析_互联网 养老的典型经验做法
- 全球微动态丨袋装蛤蜊肉怎么做好吃 蛤蜊肉怎么做好吃
- 今日小粉丸天天吃有什么危害吗_小粉-世界快看
- 安永全球CEO承认“暂时搁置”审计与咨询业务分拆计划
X 关闭
最新资讯
- 畅游泉城 乐享“五一”
- 大自然的语言中什么叫物候和物候学 大自然的语言中什么是物候和物候学
- 收入不同的人都如何理财 薪资不同的人怎么理财最合适
- 鬼之舟_关于鬼之舟简述
- 邦顿机械表_邦顿
- 斗罗大陆:终于在现实中找到朱竹清,身材神还原,大长腿毫无压力|天天快看
- 全球快报:福特野马美国定价
- 《华夏炬光 · 尧帝》献给中华民族伟大复兴组诗之十二:山林子
- 《星球大战绝地:幸存者》Steam在线峰值周末迎来新高
- 中国男队教练徐俊:丁立人加冕“棋王”胜在意志力和进取心
- 恶魔少爷别惹我小说_ems官网
- 土耳其发生旅游大巴翻覆事故 已致3死44伤 天天时快讯
- 世上最开心的五句话,解开无数人心结!
- 焦点快播:水煎包、白糖糕、滩羊肉……近四成游客跟着味蕾去旅行
- 今热点:南县明山头镇:开展五一节前安全生产检查行动
- 西安多个景区已停票限流,西安市公安局发布提示:不建议前往大唐不夜城 每日视点
- 法国高温持续 西南部山火仍未得到有效控制|天天短讯
- 汝州市气象台发布大风蓝色预警【IV级/一般】【2023-05-01】
- 游客滞留动物园淋雨齐喊“退票”是什么情况
- 新华社权威快报丨5月新规来了,关系你我生活
- 限流!限流!55元上厕所?火锅店睡满人?紧急回应!新华社三连评|世界热门
- 到了博人传里,原先的木叶十二忍如何排名?除了鸣佐,他最强 每日精选
- 5月1日生意社片碱基准价为3500.00元/吨
- 手机视频没声音怎么恢复_手机qq视频没声音怎么办
- 讯息:这次很丝滑 东风日产超混电驱奇骏冲不冲?
- 【中信证券:4月PMI数据体现服务业和工业景气分化】中信证券明明FICC研究团队认为,4月PMI数据清晰的体现了服务业和工业景气的分化。今年以来,随着国内疫情防控平稳转段,消费服务业开始呈现“报复式”复苏,“五一”假期的服务消费景气度在4月的基础上有望进一步拔高 头条焦点
- 怎么对付小人最有效的方法_道家除掉小人的方法
- 宋词背后那些有趣的灵魂 环球时快讯
- 北汽蓝谷去年亏损54.65亿元:极狐将聚焦“场景”参与市场竞争
- 曼城vs富勒姆首发:哈兰德、小蜘蛛、马赫雷斯先发,德布劳内缺席
- 环球快看点丨追觅郭人杰:“极客”追觅如何用AI解营销“数学题”
- 为什么股票卖不出去 天天即时看
- 去年是最赚钱风电整机商,明阳智能今年一季度却陷入亏损
- 酒店回应五一涨价10倍:预留房间给线下
- 天天时讯:菲律宾政府军击毙7名反政府武装分子
- 当前视讯!一季度广西推动西部陆海新通道建设实现良好开局
- 餐饮带动假日消费强劲增长 重点餐饮企业销售额同比增长36.9%
- 天天快资讯丨双师结对,助力缩小城乡科创教育差距
- 天天视点!湖北公安多轮次调研化解基层执法办案难题
- 环球视点!当日快讯:“五一”假期首日北京接待游客184万人次
- 凯度发布重磅新品 打造全厨烹净饮解决方案
- 世界快报:曼城中场京多安在接受采访时,谈到了本赛季的争冠形...
- 情歌控而已小说在线_情歌控而已 世界观察
- 中国护照含金量几何?万里归途给出答案 世界新动态
- 首轮系列赛中的绝对奇兵,湖人锋线大将简直是能攻善守无所不能? 每日热门
- 忘不了羽毛球俱乐部
- 博宝在线拍卖网官方网下载_博宝网官网
- 团圆的改编电影_团圆 2007年的短片电影-全球即时看
- 云南首届“云上·援力”消防救援综合体能交流活动圆满落幕-环球报资讯
- “五一”假前一天西安咸阳机场日客运量突破14万人次 创今年以来新高-环球快看点
X 关闭