核心要点
- Python 中的语法错误会导致解析错误
- 解析错误会阻止代码执行,导致应用无法启动
- 使用 IDE 可以实时高亮显示解析错误
编写能正常运行的代码固然重要,但编程同样离不开排查和修复错误。开发包含数万行代码的复杂应用程序时,产生的错误信息可能比银河系中的星星还要多。
这当然是夸张的说法,但确实反映出编程语言报错有多让人头疼。一个逗号的缺失,或者少写一个括号,都可能导致应用程序无法启动。
这类问题被称为语法错误,您可能也听过“解析错误”这个说法,这是因为当 Python 的解析器无法理解代码时,就会抛出语法错误。
好在 Python 通常会精确指出报错所在的代码行,并给出问题说明。不过有时候它标注的行号会有些偏差,或者说明过于笼统,难以直接定位问题。
为了帮助您理清 Python 语法的头绪,本文将介绍如何识别和解决 Python 中的解析错误。在进入实践之前,我们先简单梳理一下解析错误与语法错误的区别,以及它们的常见成因。
解析错误与语法错误的区别
我们先从基础说起。每一种编程语言(Python、JavaScript、C++ 等)都有自己的一套语法规则,就像人类语言一样。当代码的解析器无法理解所写的代码时,就会出现解析错误。
Python 语法错误是解析错误最常见的成因。一旦出现无效语法或缩进错误,Python 就会显示语法错误,并在大多数情况下给出简要的问题说明。
另外,不要把解析错误和数据解析错误混为一谈。后者指的是在将非结构化数据转换为更易读格式的过程中出现的错误。如果您想进一步了解,可以阅读我们详尽的数据解析指南,但现在只需记住,这是两件完全不同的事情。
还需要注意的是,解析器是 Python 解释器中负责理解并执行 Python 代码的部分。一旦出现语法错误,解释器就会中断,代码也就无法执行。
最后,不要把语法错误和 Python 异常混为一谈。异常发生在程序执行过程中,因此也被称为运行时错误;而语法错误则会导致程序根本无法启动。
Python 解析错误的常见成因
Python 以对初学者友好的语法著称,但即使是经验丰富的开发者也难免出错。有些错误很容易发现,比如拼写错误;而缩进错误如果没有 Python 自动提示,可能需要花费数小时才能找到。
请记住,出现解析错误时,Python 代码根本无法执行,因此必须先修复这些错误,才能看到应用程序的实际运行效果。以下是 Python 解析错误最常见的几种成因。
缺少冒号或括号
冒号(:)和括号(())在 Python 代码结构中极为重要。冒号标志着代码块的开始,总是写在行末;而括号则用于定义函数调用、运算顺序和表达式分组。
下面是我们使用 Visual Studio Code 编写的一个包含无效语法的示例。
def example_function()
print("This produces error")
文本编辑器会立即用 ^ 符号标记解析器遇到问题的确切位置。如果您尝试在终端中运行代码,还能看到更详细的信息,具体结果见下图。

程序提示:定义示例函数后应当有一个冒号。由于下一行开启了新的代码块,因此必须用冒号将它与上一条语句分隔开。
括号也是同样的道理。如果您写出以下代码:
print("This also produces an error")
您会在终端中看到类似的 Python 解析错误提示。

可以看到,它准确识别出第一行缺少右括号。另外请注意 Pylance 这个关键词,它之所以出现,是因为我们在 IDE 中添加了 Pylance 语言服务器。
这类工具能够高亮显示 Python 语法元素、检查代码中的语法错误,并给出说明和建议。在处理 Python 无效语法问题时,此类工具对快速发现并处理语法错误极具价值。
缩进不正确
Python 使用缩进来组织代码块,这一点不同于使用花括号({})的 C、C++ 或 JavaScript。对 Python 新手而言,这是一种极为常见的报错,因为缩进问题本身也很难被肉眼发现。
缩进指的是实际代码前面的空白。在 Python 中,同一代码块必须具有相同的缩进,也就是说它们与左边界的距离必须一致。Python 不使用花括号之类的符号,而是通过正确的缩进来标记代码块的起止位置。
我们以下面这段代码为例:
for x in range(5):
print("correct")
print("not correct")
print("correct")
Python 解释器将第三行标记为错误。第二行开启了一个新的代码块,缩进正确;但请注意,第三行多缩进了一个空格。第四行则是正确的,因为它会在 'for' 循环结束后执行,因此属于同一个缩进一致的代码块。
无效的词法单元(token)或符号
和所有编程语言一样,Python 对词法单元(token)和符号的正确使用也有严格要求。
解释器能够理解的最小有意义单元称为 token,包括标识符(如 my_example 这样的变量名)、关键字(for、while、class、except 等)、字面量(数字和“字符串”)、标点符号({ })以及运算符(*、-、+)。
例如,以下这行代码:
example_list = ["apple", "carrot" "peach"]
会返回错误,因为列表的第二项和第三项之间缺少逗号。
符号(symbol)则是一种更抽象的单元,用于存储以下信息:
- 它的类型(函数、数字、类等)。
- 符号的作用域说明它可以在代码的哪些地方使用。
- 其内存位置说明该值存储在何处。
我们以下面这行代码为例:
price = 10 + 5
price 会被标记为一个 token,它是一个整数变量。如果您将其改写为 price = 10€ + 5€,就会出现语法错误,因为其中使用了不受支持的符号。
不当使用保留关键字
Python 的保留关键字各自具有特定且固定的用途。如果您尝试将保留关键字用于其定义之外的其他用途,就会出现语法错误。
例如,'class' 是一个保留关键字,其后必须跟一个类名。下面是一个错误用法,会导致 Python 解释器报出解析错误。
class = "an_example"
这会被标记为语法错误,因为 Python 不允许在 class 保留关键字后直接使用 = 运算符,而应采用以下
class ExampleClass:
语法结构:冒号后的下一行编写类定义代码。
如何修复 Python 中的解析错误
请记住,这类错误不是 Python 异常,会导致代码完全无法运行,因此无法依赖常规的代码调试器。您需要依靠自己对 Python 语法的掌握,不过该语言本身也会通过错误说明给您提供帮助。
以下是几个可以帮您入门的调试技巧。
检查错误信息
首先,仔细查看 Python 解析错误信息,您可以从中获得以下内容:
- 错误类型(本例中为 SyntaxError)。
- 错误说明,例如缺少逗号或缩进错误。
- 发生错误的文件名。
- 代码所在的行号。
另外,留意 ^ 符号,它会精确指向错误发生的位置。
检查缩进
大多数情况下,Python 会用 ^ 符号精确标出缩进错误的位置。但是,当面对成百上千行各自缩进不同的代码时,仅凭肉眼很难发现问题,需要仔细检查报错行及其前后的代码才能找到问题所在。
排查常见错误
检查代码中是否缺少逗号、右括号、引号使用是否正确,以及语句后是否缺少冒号。虽然有些编程错误确实棘手,可能需要数小时甚至数天才能解决,但您可能会惊讶地发现,很多错误其实只是源于一个拼写错误或未闭合的代码块。
使用 IDE 或 linter 进行语法检查
能够通过手动检查代码来处理语法错误固然体现出扎实的编程语言功底,极具价值。但在大多数情况下,您还是会依赖内置语法纠错功能的专用工具。
大多数集成开发环境(IDE),比如我们用作示例的 Visual Studio Code,都内置了解析器用于发现语法错误。此外,Pylance 或 Python debugger 等扩展插件还能带来更多好处,例如快速修复、类型提示、表达式求值等。
最后,不妨了解一下 linter。这类工具专门用于分析代码中的 bug、低效代码块、语法错误,乃至结构性问题。请注意,在编写更复杂的动态代码时,您很可能需要借助更高级的工具来解决棘手的问题。
如何在今后避免解析错误
掌握处理语法错误的方法固然重要,但培养预防错误的能力同样关键。以下三个技巧可以帮助您更顺利地前行。
使用支持语法高亮的代码编辑器
内置语法纠错功能的代码编辑器能大幅简化开发流程,除了高亮错误和提供输入建议外,还可以通过插件(如 Python Pylance)进行功能扩展;代码编辑器还会高亮语法元素,让您轻松理清动态代码结构。
编写模块化、简洁的代码
编写简洁的代码不仅对自己有益,也方便团队协作。首先,我们推荐一本广受好评的书籍,专门讲解如何编写简洁代码。将代码拆分为逻辑独立的模块,便于审阅;同时保留简明扼要的注释,帮助其他开发者快速理解您的逻辑。
开发过程中频繁运行代码
错误会导致代码完全无法运行,因此通过频繁运行代码即可及时发现问题。建议每写几个代码块就运行一次,尽早捕获 bug;如果拖到几天后才发现,排查起来会更加混乱。
结语
遇到解析错误难免让人沮丧,但这也是开发过程中不可或缺的一部分。不妨把这些问题当作提升自己能力的机会。
在编写复杂的动态代码时,您常常需要想出创新的解决方案。提前了解可能出现的失败场景,有助于写出可正常运行的代码,而这正是迈向高级开发工程师职位的关键一步。
Python 中的解析错误是什么
在 Python 中,当解释器中的解析器无法理解所写代码时,就会出现解析错误。该错误发生在代码执行之前,通常由语法错误引起。
Python 中解析错误的原因是什么
语法错误是导致 Python 解析错误的原因,例如缺少逗号或缩进错误。请留意 Python 报错信息,其中通常会附带简要说明。
Python 中的 parse() 是什么
parse() 并非 Python 原生函数,但在多个 Python 库中被广泛使用,用于将非结构化数据转换为结构化程度更高的格式,这与网络爬取中的数据解析类似。