如果您在Python代码中拼错了关键字,那么您将得到一个SyntaxError。例如,如果你把关键字拼错了,会发生以下情况:
>>> fro i in range(10): File "<stdin>", line 1 fro i in range(10): ^ SyntaxError: invalid syntax
消息将读取SyntaxError:无效语法,但这没有多大帮助。回溯指向Python可以检测到错误的第一个地方。要修复这类错误,请确保所有Python关键字拼写正确。
另一个关于关键字的常见问题是你完全忽略了它们:
>>>
>>> for i range(10): File "<stdin>", line 1 for i range(10): ^ SyntaxError: invalid syntax
同样,异常消息也不是很有用,但是回溯确实试图为您指出正确的方向。如果从插入符号返回,则可以看到for循环语法中缺少关键字in。
您还可能误用受保护的Python关键字。记住,关键字只允许在特定的情况下使用。如果您不正确地使用它们,那么您的Python代码中就会出现无效的语法。一个常见的例子是在循环外使用continue或break。这在开发过程中很容易发生,当你在实现一些东西的时候,碰巧把逻辑移出了一个循环:
>>> names = ['pam', 'jim', 'michael'] >>> if 'jim' in names: ... print('jim found') ... break ... File "<stdin>", line 3 SyntaxError: 'break' outside loop >>> if 'jim' in names: ... print('jim found') ... continue ... File "<stdin>", line 3 SyntaxError: 'continue' not properly in loop
在这里,Python很好地告诉了您到底哪里出了问题。"'break' outside loop"和" continue' not exactly in loop"这两个信息可以帮助你明确地知道该怎么做。如果这段代码在一个文件中,那么Python也会让插入符号指向被误用的关键字。
另一个例子是,如果你尝试给一个变量分配一个Python关键字,或者使用一个关键字来定义一个函数:
>>>
>>> pass = True File "<stdin>", line 1 pass = True ^ SyntaxError: invalid syntax >>> def pass(): File "<stdin>", line 1 def pass(): ^ SyntaxError: invalid syntax
当您试图为pass分配一个值时,或者当您试图定义一个名为pass的新函数时,您将得到一个SyntaxError并再次看到“无效语法”消息。
在Python代码中解决这种类型的无效语法可能会稍微困难一些,因为代码从外部看起来没什么问题。如果您的代码看起来不错,但是您仍然会得到一个SyntaxError,那么您可以考虑检查您想要使用的变量名或函数名与您正在使用的Python版本的关键字列表。
受保护的关键字列表随着Python的每个新版本而改变。例如,在Python 3.6中,您可以使用await作为变量名或函数名,但是在Python 3.7中,这个单词已经被添加到关键字列表中。现在,如果您尝试使用await作为变量名或函数名,如果您的代码是Python 3.7或更高版本,那么这将导致SyntaxError。
另一个例子是print,它在python2和python3中有所不同:
Version | print Type | Takes A Value |
---|---|---|
Python 2 | keyword | no |
Python 3 | built-in function | yes |
print是python2中的一个关键字,所以你不能给它赋值。然而,在python3中,它是一个可以赋值的内置函数。
你可以运行以下代码来查看关键字列表,无论你运行的Python版本是什么:
import keyword print(keyword.kwlist)yword.iskey
keyword还提供了有用的keyword.iskeyword()。如果你只是需要一个快速的方法来检查通过变量,那么你可以使用以下一行:
>>> import keyword; keyword.iskeyword('pass') True
这段代码将快速告诉您要使用的标识符是否是关键字。
通常,Python代码中无效语法的原因是缺少或不匹配的右括号、方括号或引号。在嵌套圆括号的很长行或更长的多行块中很难发现这些。你可以通过Python的回溯来发现不匹配或缺失的引用:
>>>
>>> message = 'don't' File "<stdin>", line 1 message = 'don't' ^ SyntaxError: invalid syntax
这里,回溯指向无效代码,其中在结束单引号后有一个t'。要解决这个问题,您可以进行以下两种更改之一:
用反斜杠转义单引号('don\t')
将整个字符串用双引号括起来(“don't”)
另一个常见的错误是忘记关闭字符串。对于双引号和单引号字符串,情况和回溯是相同的:
>>>
>>> message = "This is an unclosed string File "<stdin>", line 1 message = "This is an unclosed string ^ SyntaxError: EOL while scanning string literal
这一次,traceback中的插入符号指向问题代码。SyntaxError消息“在扫描字符串文字时的EOL”更具体一些,有助于确定问题。这意味着Python解释器在一个开放字符串关闭之前到达该行(EOL)的末尾。要解决这个问题,请使用与开始时匹配的引号关闭字符串。在本例中,将使用双引号(")。
在f-string语句中缺少引号也会导致Python中无效的语法:
1 # theofficefacts.py 2 ages = { 3 'pam': 24, 4 'jim': 24, 5 'michael': 43 6 } 7 print(f'Michael is {ages["michael]} years old.')
这里,打印的f-string中对ages字典的引用缺少关键引用的双引号。得到的回溯结果如下:
$ python theofficefacts.py File "theofficefacts.py", line 7 print(f'Michael is {ages["michael]} years old.') ^ SyntaxError: f-string: unterminated string
Python识别问题并告诉您它存在于f-string中。消息“未终止字符串”也指出了问题所在。本例中的插入符号仅指向f-string的开头。
当插入符号指向f-string的问题区域时,这可能没有那么有用,但是它确实缩小了您需要查找的范围。在那个f字串的某个地方有一个未终止的字符串。你只需要找到在哪里。要修复此问题,请确保所有内部f-string引号和方括号都已存在。
缺少括号和方括号的情况大致相同。例如,如果您从列表中删除了右方括号,那么Python将会发现并指出它。然而,这有一些变化。第一种是把列表中的右括号去掉:
本文地址:百科问答频道 https://www.neebe.cn/wenda/903360_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!