当前位置: 首页 > 后端技术 > Python

翻译:《实用的Python编程》08_03_Debugging

时间:2023-03-26 14:44:28 Python

类别|上一节(8.2日志)|[下一节(9包)]()8.3调试调试建议假设程序崩溃:bash%python3blah.pyTraceback(mostrecentcalllast):File"blah.py",line13,in?foo()文件“blah.py”,第10行,在foobar()文件“blah.py”,第7行,在barspam()文件“blah.py”,第4行,在垃圾邮件行x.append(3)AttributeError:'int'objecthasnoattribute'append'那么我们现在应该做什么呢?阅读回溯的最后一行,了解程序崩溃的确切原因:bash%python3blah.pyTraceback(mostrecentcalllast):File"blah.py",line13,in?foo()文件“blah.py”,第10行,在foobar()文件“blah.py”,第7行,在barspam()文件“blah.py”,第4行,在垃圾邮件行x.append(3)#CauseofthecrashAttributeError:'int'objecthasnoattribute'append'不过,回溯信息并不总是易于阅读或理解。专业提示:将整个回溯粘贴到Google中。当使用交互式解释器(REPL)执行脚本时,可以使用选项-i来保持Python存活(keepalive)。bash%python3-iblah.pyTraceback(最后一次调用):文件“blah.py”,第13行,在?foo()文件“blah.py”,第10行,在foobar()文件“blah.py”,第7行,在barspam()文件“blah.py”,第4行,在垃圾邮件行x.append(3)AttributeError:'int'objecthasnoattribute'append'>>>option-icankeeptheinterpreterstate.这意味着可以在程序崩溃后查找错误消息。检查变量的值和其他状态。使用打印调试使用print()函数进行调试非常普遍。建议:确保您使用的是repr()函数。defspam(x):print('DEBUG:',repr(x))...repr()函数显示值的准确表示,而不是格式良好的输出。>>>fromdecimalimportDecimal>>>x=Decimal('3.4')#NO`repr`>>>print(x)3.4#WITH`repr`>>>print(repr(x))Decimal('3.4')>>>Python的调试器可以在程序中手动启动调试器(debugger)。defsome_function():...breakpoint()#进入调试器(Python3.7+)...以上将在调用breakpoint()时启动调试器。在较早的Python版本中,您可能会看到这样的调试指南:importpdb...pdb.set_trace()#Insteadof`breakpoint()`...(译注:Python3.7之后,您可以使用内置函数breakpoint()代替importpdb;pdb.set_trace())在调试解释器下运行程序也可以在调试器下运行整个程序:bash%python3-mpdbsomeprogram.py以上操作会自动进入调试前语句控制器的第一行,允许设置断点和修改配置。常用调试器命令:(Pdb)help#获取帮助(Pdb)w(here)#打印堆栈跟踪(Pdb)d(own)#向下移动一层堆栈(Pdb)u(p)#向上移动一层堆栈(Pdb)b(reak)loc#设置断点(Pdb)s(tep)#执行一条指令(Pdb)c(ontinue)#继续执行(Pdb)l(ist)#列出源代码(Pdb)a(rgs)#Printargsofcurrentfunction(Pdb)!statement#Execute语句断点的位置可以用以下任意一种方式表示:(Pdb)b45#Line45incurrentfile(Pdb)bfile.py:45#Line34infile.py(Pdb)bfoo#Functionfoo()incurrentfile(Pdb)bmodule.foo#Functionfoo()inamoduleExercise练习8.4:错误?什么是错误?如果有错误,我们将解决它们错误(它运行。发货!)。目录|上一节(8.2日志)|[下一节(9个包)]()注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢