SyntaxError的来源
当您运行 Python 代码时,解释器将首先解析它以将其转换为 Python 字节码,然后执行。解释器将在程序执行的第一阶段(也称为解析阶段)中发现 Python 中的任何无效语法。如果解释器无法成功解析您的 Python 代码,则意味着您在代码中的某处使用了无效语法。解释器将尝试向您显示该错误发生的位置。
当您第一次学习 Python 时,遇到 SyntaxError 可能会令人沮丧。Python 将尝试帮助您确定代码中无效语法的位置,但它提供的回溯可能有点令人困惑。有时,它指向的代码非常好。
注意:如果您的代码在语法上是正确的,那么您可能会引发其他不是 SyntaxError 的异常。
今天,咱们就来看看Python中6个常见的语法问题。
当您第一次遇到 SyntaxError 时,了解为什么会出现问题,以及如何修复 Python 代码中的无效语法,会很有帮助。
在下面的部分中,您将看到可能引发 SyntaxError 的一些更常见的原因,以及如何修复它们。
滥用赋值运算符 (=)
在 Python 中有几种情况,您无法对对象进行赋值。一些示例分配给文字和函数调用。在下面的代码块中,您可以看到一些尝试执行此操作的示例,以及由此产生的SyntaxError 回溯:
>>> len('hello') = 5 File "
第一个示例尝试将值 5 分配给 len() 调用。SyntaxError 消息在这种情况下非常有用。它告诉你不能给函数调用赋值。
第二个和第三个示例尝试为文字分配一个字符串和一个整数。相同的规则适用于其他文字值。回溯消息再次表明当您尝试为文字赋值时出现问题。
您的意图很可能不是为文字或函数调用分配值。例如,如果您不小心遗漏了额外的等号 (=),就会发生这种情况,这会将赋值转换为比较。如下所示,比较是有效的:
>>> len('hello') == 5 True
拼写错误、遗漏或误用 Python 关键字
Python 关键字是一组受保护的词,在 Python 中具有特殊含义。这些词不能用作代码中的标识符、变量或函数名称。它们是语言的一部分,只能在 Python 允许的上下文中使用。
错误使用关键字的常见方式有以下三种:
① 关键字拼写错误;
② 缺少关键字;
③ 滥用关键字;
如果您在 Python 代码中拼错了关键字,则会收到 SyntaxError。例如,如果关键字 for 拼写错误,会发生以下情况:
>>> fro i in range(10): File "
该消息显示 SyntaxError: invalid syntax ,但这不是很有帮助。回溯指向 Python 可以检测到错误的第一个位置。要修复此类错误,请确保所有 Python 关键字拼写正确。
关键字的另一个常见问题是当您完全忘记写时:
>>> for i range(10): File "
再一次,异常消息并没有那么有用,但回溯确实会尝试为您指明正确的方向。如果从插入符号中移回,则可以看到 for 循环语法中缺少 in 关键字。 您还可以滥用受保护的 Python 关键字。请记住,关键字只允许在特定情况下使用。如果您错误地使用它们,那么您的 Python 代码中将包含无效的语法。一个常见的例子是在循环外使用 continue 或 break。这很容易在开发过程中发生,当您正在实现事物并碰巧将逻辑移到循环之外时:
>>> names = ['pam', 'jim', 'michael'] >>> if 'jim' in names: ... print('jim found') ... break ... File "
在这里,Python 可以很好地告诉您究竟出了什么问题。消息“'break' 外循环”和“'continue' 未正确循环”可帮助您确定要做什么。如果这段代码在一个文件中,那么 Python 也会有指向误用关键字的插入符号。 另一个示例是,如果您尝试将 Python 关键字分配给变量或使用关键字来定义函数:
>>> pass = True File "
缺少括号、方括号和引号
通常,Python 代码中无效语法的原因是缺少或不匹配的右括号、方括号或引号。这些在很长的嵌套括号行或更长的多行块中很难发现。借助 Python 的回溯,您可以发现不匹配或丢失的引号:
>> message = 'don't' File "
在这里,回溯指向无效代码,其中在结束单引号之后有一个 t'。要解决此问题,您可以进行以下两项更改之一:
① 用反斜杠转义单引号 ('don't');
② 用双引号将整个字符串括起来("don't");
另一个常见的错误是忘记关闭字符串。对于双引号和单引号字符串,情况和回溯是相同的:
>>> message = "This is an unclosed string File "
错误的字典语法
您之前看到,如果您将逗号放在字典元素之外,您可能会得到 SyntaxError。Python 字典的另一种无效语法形式是使用等号 (=) 来分隔键和值,而不是使用冒号:
>>> ages = {'pam'=24} File "
同样,此错误消息不是很有帮助。然而,重复的行和插入符号非常有帮助!他们直指问题人物。
如果您将 Python 语法与其他编程语言的语法混淆,则此类问题很常见。如果您将定义字典的行为与 dict() 调用混淆,您也会看到这一点。要解决此问题,您可以用冒号替换等号。您还可以切换到使用 dict():
>>> ages = dict(pam=24) >>> ages {'pam': 24}
使用错误的缩进
其他编程语言使用花括号表示代码块,而 Python 使用空格。这意味着 Python 期望代码中的空白行为可预测。如果代码块中的一行包含错误的空格数,它将引发 IndentationError:
def foo(): for i in range(10): print(i) print('done') foo()
这可能很难看到,但第 5 行仅缩进了 2 个空格。应该和for循环语句一致,多4个空格。值得庆幸的是,Python 可以很容易地发现这一点,并会很快告诉您问题所在。
不过,这里也有一些歧义。print('done') 行是在 for 循环之后还是在 for 循环块内?当你运行上面的代码时,你会看到以下错误:
File "indentation.py", line 5 print('done') ^ IndentationError: unindent does not match any outer indentation level
尽管回溯看起来很像 SyntaxError 回溯,但它实际上是一个 IndentationError。错误信息也很有帮助。它告诉您该行的缩进级别与任何其他缩进级别都不匹配。换句话说,print('done') 被缩进了 2 个空格,但是 Python 找不到任何其他符合这种缩进级别的代码行。您可以通过确保代码与预期的缩进级别对齐来快速解决此问题。
定义和调用函数
在定义或调用函数时,您可能会在 Python 中遇到无效语法。例如,如果在函数定义的末尾使用分号而不是冒号,则会看到 SyntaxError:
>>> def fun(); File "
这里的回溯非常有用,插入符号直接指向问题字符。您可以通过将分号替换为冒号来清除 Python 中的这种无效语法。
此外,函数定义和函数调用中的关键字参数都需要按正确的顺序排列。关键字参数总是在位置参数之后。不使用此顺序将导致 SyntaxError:
>>> def fun(a, b): ... print(a, b) ... >>> fun(a=1, 2) File "
评论
查看更多