如何调试您的Python代码?

译文
开发 后端
本文将以Python为例,和您讨论八种有关代码调试的优秀实践。它们既可以被单独使用,也能够通过组合来增强效果。

[[406423]]

【51CTO.com快译】对于码农而言,如果说能够编写出有效的代码,会给他们带来满满的成就感的话;那么当其代码中出现缺陷、甚至是错误时,他们则会产生深深的挫败感。因此,为了避免在软件运行的过程中,出现各种意想不到的错误,我们需要通过针对程序的调试,来消除各种代码级别的错误。本文将以Python为例,和您讨论八种有关代码调试的优秀实践。

何为Python异常?

每当Python无法解释某段目标代码或命令时,程序往往会抛出异常。Python的各种异常,实际上是Python在执行代码时,出现的一组错误集合。

通常,Python会使用try和except块,来触发各种错误异常。由于可执行的命令往往位于try块之内,因此当try中的代码出现失败时,Python就会去执行except块中的代码。也就是说,except关键字中的语句本质上就是try块中的那些异常,Python只是将它们作为错误而触发罢了。当然,一个try...except块有时候也可能会包含多个带有except关键字的异常。其中包含了许多我们在Python中常见的典型错误与详细信息。

由于我们在使用各种内置函数、软件库或Python框架时,都可能会碰到异常,因此,即便您认真编写和遵守了正确的语法,也无法保证相关方法在调用和执行时不会出错。例如,您可能只编写了大约5行代码,但是Python程序会发现到您正在使用的某个库、框架或内置方法的源代码中,存在着预定义的相关异常,因此会在第200行处触发异常错误。

语法错误

当程序代码无法在语法层面上被识别时,Python通常会抛出语法级别的错误。如果您是Python的初学者,那么就可能会频繁地遇到此类语法错误。不过,由于这些错误比那些深层次的异常(in-depth exceptions)更易于被追溯,因此您一旦掌握了基本原理,就很容易对它们进行合理的处理。

如何调试你的Python代码

Python的典型异常包括:缩进、类型、以及名称错误等方面。它们既可能来自单行代码,也可能源于某个代码块。我们虽然没有统一的方法对其进行处置,但是可以根据各种实例和项目类型,去予以应对。下面,让我们来具体讨论可用于调试Python的八种方法。它们既可以被单独使用,也能够通过组合来增强效果。

1.检查错误描述

处理Python错误的可用方法之一是查看错误的描述。Python通常会在其错误输出的最后一行给予详细的说明。例如:在解析意外的EOF(End Of File)时,我们会发现它们通常与缺少括号有关。也就是说,当您尝试着从类或对象处调用某个错误的函数时,就会出现AttributeError之类无效的语法(invalid syntax)错误。因此,通过最终一行的“蛛丝马迹”,您往往能够成功地追踪错误的来源,并着手重写其相关的代码。

2.追踪错误的来源

Python的错误具有较强的代码行限定性(line-bound),在遇到错误时,您需要注意Python所指向的具体行号。例如,由于下面的代码会尝试着连接不同的数据类型(字符串和整数),因此会产生类型方面的错误(type error)。其错误信息指向了示例代码中的第2行:

示例代码:

  1. db = open("output.txt""a"
  2. a = "Hello"+1 
  3. b = "How do you do?" 
  4. db.write(a+", "+b+" 
  5. ") 

错误信息:

  1. raceback (most recent call last): 
  2.   File "C:\Users\Omisola Idowu\Desktop\Lato 
  3. oup 
  4. ew.py", line 2, in  
  5.     a = "Hello"+1 
  6. TypeError: can only concatenate str (not "int"to str 

下面让我们再来看另一个错误示例:

代码:

  1. def findTotal(a): 
  2.     for i in a 
  3.         print(sum(i)*2) 

错误信息:

  1. File "C:\Users\Omisola Idowu\Desktop\Lato 
  2. oup 
  3. ew.py", line 2 
  4.     for i in a 
  5.              ^ 
  6. SyntaxError: invalid syntax 

显然,Python指出了第2行的语法错误。如果您熟悉Python的话,就能够一眼看出:实际上,这是因为在for循环后面缺少的一个冒号。

3.在命令行上利用Trace方法

虽然您可以使用内置的集成开发和学习环境(Integrated Development and Learning Environment,IDLE)去调试Python,但是它不一定适合大型的软件项目。因此,调试Python的可用方法之一实际上是采用命令行界面(command-line interface,CLI)。它与在JavaScript中运行console.log()有着相似的效果。

如果您在代码执行过程中遇到了错误,则可以启动CLI,并使用trace命令去试着运行有问题的脚本。其基本工作原理是对代码进行逐行检查,并对发现问题的地方予以解析。

若要调用该方法,请在命令行中,以如下方式运行代码文件:

  1. python -m trace --trace file_name.py 

在大型项目中,虽然以上述方式运行整个脚本并不切实际,但是您可以创建一个单独的Python文件,将每个代码块(一次仅一段)逐个粘贴到该文件中,然后分别运行上述命令。在此,您可以将其视为单元性调试的一种特有形式。

4.测试您的代码

除了上述提到的异常原因之外,错误的布尔值(boolean)有时也会导致您的程序在部署中表现异常或出现错误。单元测试往往涉及到需要隔离代码中的某些单元(块或行),以测试具体的性能、效率、以及正确性等指标。它们对于程序代码而言都是极其重要的。在单元测试中,我们可以使用多种调试技术,来通过assert函数对代码的正确性进行分析,以及检查代码在运行过程中所需的时间等维度指标。

在实际生产环境中,我们可以创建一个名为test.py的单独Python文件,并在该文件中测试每个代码单元。如下代码段展示了单元测试的一个示例:

  1. data = { 
  2. "guitars":[ 
  3. {"Seagull":"$260"}, 
  4. {"Fender":"$700"}, 
  5. {"Electric-acoustic":"$600"
  6. if len(data["guitars"])==2: 
  7.     for i in data["guitars"]: 
  8.         print(i) 
  9. assert len(data["guitars"])==2, "Length less than what's required, should be 3" 

可见,由于数组的长度小于3,因此Python会触发如下断言错误:

  1. AssertionError: Length less than what's required, should be 3 

5.使用日志

作为调试代码的另一种方法,Python内置了一套日志库,可供日志的检查与勘误。您可以通过链接--https://docs.python.org/3/howto/logging.html,来进一步了解其工作原理,以及如何在控制台中的运行和捕获它们。如果您觉得在部署应用的过程中,无法通过控制台来查看到日志,则可以通过设置简单邮件传输协议(SMTP),以便于将代码日志以电子邮件的方式及时捕获与分析。

6.使用标准的Python调试器

Python有一个被称为pdb的、非常流行的板载调试器。由于它是内置的,因此您只需要将pdb导入待测试文件中即可。pdb模块可以通过对代码采取事后执行(post-mortem)的方式,来调试程序在运行过程中出现的突然崩溃现象。

您既可以将pdb用于运行整个Python文件,也可以仅执行某个单元,以深入到程序的每一行去发现潜在的错误。在实际使用中,您需要首先打开Python文件,然后通过importpdb;pdb.set_trace(),来启动pdb调试器。接着,您可以通过CLI运行待测试的Python文件(请参见--https://www.makeuseof.com/run-python-script/):

  1. Python Your_Python_file.py 

通过如下带有h的命令,您可以查看到pdb的所有可用命令列表:

  1. (pdb) h 

列表的输出如下图所示:

例如,您可以通过如下命令,来逐行罗列出代码:

  1. (pdb) l 

7.使用IDE进行调试

IDE也是用于调试Python脚本的宝贵工具。其中:

  • Visual Studio Code(https://code.visualstudio.com/download)能够协助您运行与调试Python程序中的各项功能。
  • 作为一种语言类支持插件,Pylance可允许您在调试的模式下运行自己的代码。
  • 作为另一个出色的IDE,Pycharm(https://www.jetbrains.com/pycharm/download/)可以帮助您更加深入地查找代码中的错误。
  • Eclipse(http://www.eclipse.org/downloads/packages/)也提供了一个名为Pydev的第三方插件,以实现针对Python脚本的轻松调试。

8.在网上搜索解决方案

鉴于Python具有庞大的开发者社区,您不妨将互联网作为寻找解决Python代码问题的可靠资源。例如,Stackoverflow(https://stackoverflow.com/)便是一个流行的代码社区,您可以在其中进行各种互动式的问答。当然,YouTube上也包含了大量的有关Python编程的实用视频。

原文标题:How to Debug Your Python Code,作者:IDOWU OMISOLA

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

责任编辑:华轩 来源: 51CTO
相关推荐

2021-08-24 23:23:35

Python工具开发

2009-12-04 13:45:12

VS调试

2024-03-06 08:52:59

C#Emit代码

2022-03-04 20:28:02

VueReact网页

2023-09-04 11:46:09

C#动态代码

2010-03-01 11:06:52

Python 调试器

2014-05-14 00:50:18

JoyentNode

2020-06-23 09:48:09

Python开发内存

2020-06-14 14:48:23

机器学习Python

2020-04-26 10:01:14

编程学习技术

2012-03-01 11:47:01

2021-11-17 21:58:02

Python编程语言

2021-11-12 08:00:00

抽象开发代码

2023-06-28 08:12:49

Python代码重构

2020-01-06 10:01:12

JavaScript浏览器HTML

2021-07-02 07:06:20

调试代码crash

2023-01-30 15:55:08

2021-07-29 11:40:22

Gartner数据质量数据分析

2022-04-12 13:22:50

物联网物联网业务IOT

2015-10-27 10:08:55

移动战略BYOD
点赞
收藏

51CTO技术栈公众号