0. 错误出现之前:语法高亮和代码格式化
甚至在遇到一个SyntaxError
,有重要的测量需要处理SyntaxErrors
,因为最好的处理方式是SyntaxErrors
首先要避免它们。首先,这可以通过使用编辑器或集成开发环境 (IDE) 来完成,该环境具有语法高亮 https://en.wikipedia.org/wiki/Syntax_highlighting对于Python。
除此之外,我们还可以降低遇到问题的风险SyntaxError
通过良好的代码和格式化风格。 “良好的格式风格”一词有一个正式的定义,PEP 8——Python 代码风格指南 https://www.python.org/dev/peps/pep-0008/。正确的格式使我们的代码更具可读性,从而降低了编写导致错误的代码的风险SyntaxError
.
将良好的格式应用于代码的一个非常好的方法是使用自动代码格式化工具。代码格式化程序具有多种优点,其中包括: 代码格式一致。它应用了您可能还没有想到的最佳实践。非常方便。
对于Python来说,black https://pypi.org/project/black/是一个很棒的代码格式化工具。
1. 了解错误信息
语法错误表明解释器在我们的代码中的哪个文件和哪一行中遇到了问题。我们应该使用这些信息来查找错误。
我们应该意识到,Python 解释器有时会指示SyntaxError
在行中after实际问题。这是因为解析器期望错误行中存在某些内容,并且只有在解析整行后才能识别出该内容缺失。此类的原型示例SyntaxError
是缺少括号。例如,下面的代码引发了一个SyntaxError
排队2
,即使错误是一致的1
:
bar = foo(
baz()
- EOL 代表“生产线结束”。这有助于理解非常常见的
SyntaxError: EOL while scanning string literal
。当您没有使用右引号正确关闭字符串定义时,通常会引发此问题,如下例所示:
foo = "bar
2. 简化代码
一般来说,错误修复的一个好策略是将抛出错误或异常(或不返回预期输出)的任何代码减少到最小的例子 https://stackoverflow.com/help/minimal-reproducible-example。 (这是 Stack Overflow 上提问的必要条件,但更重要的是,这是一种确定错误的好技术。)
如果出现SyntaxError
,生成一个最小的示例通常非常容易,因为SyntaxError
不依赖于变量的任何值、对象的任何状态或代码的任何其他语义。这就是为什么a的来源SyntaxError
通常是一行代码。
因此,为了识别错误,我们删除了除我们认为错误来源的行之外的所有代码。如果错误消失,则说明它已处于不同的行中。如果错误仍然存在,我们会尝试简化这一行。例如,我们通过定义保存值的中间变量来替换嵌套括号:
代替
bar = foo(foo(baz(foo()))
以下(逻辑上等效)代码:
first = foo()
second = baz(first)
third = foo(second)
bar = foo(third
使我们更容易识别丢失的右括号。