你一定遇到过Python中的无效语法,常见原因和解决办法( 三 )


另一个例子是print , 它在python2和python3中有所不同:
你一定遇到过Python中的无效语法,常见原因和解决办法文章插图
print是python2中的一个关键字 , 所以你不能给它赋值 。 然而 , 在python3中 , 它是一个可以赋值的内置函数 。
你可以运行以下代码来查看关键字列表 , 无论你运行的Python版本是什么:
import keywordprint(keyword.kwlist)yword.iskeykeyword还提供了有用的keyword.iskeyword() 。 如果你只是需要一个快速的方法来检查通过变量 , 那么你可以使用以下一行:
>>> import keyword; keyword.iskeyword('pass')True这段代码将快速告诉您要使用的标识符是否是关键字 。
3.缺少括号、方括号和引号
通常 , Python代码中无效语法的原因是缺少或不匹配的右括号、方括号或引号 。 在嵌套圆括号的很长行或更长的多行块中很难发现这些 。 你可以通过Python的回溯来发现不匹配或缺失的引用:
>>> message = 'don't'File "", line 1message = 'don't'^SyntaxError: invalid syntax这里 , 回溯指向无效代码 , 其中在结束单引号后有一个t' 。 要解决这个问题 , 您可以进行以下两种更改之一:

  1. 用反斜杠转义单引号('don\t')
  2. 将整个字符串用双引号括起来(“don't”)
另一个常见的错误是忘记关闭字符串 。 对于双引号和单引号字符串 , 情况和回溯是相同的:
>>> message = "This is an unclosed stringFile "", line 1message = "This is an unclosed string^SyntaxError: EOL while scanning string literal这一次 , traceback中的插入符号指向问题代码 。 SyntaxError消息“在扫描字符串文字时的EOL”更具体一些 , 有助于确定问题 。 这意味着Python解释器在一个开放字符串关闭之前到达该行(EOL)的末尾 。 要解决这个问题 , 请使用与开始时匹配的引号关闭字符串 。 在本例中 , 将使用双引号(") 。
在f-string语句中缺少引号也会导致Python中无效的语法:
# theofficefacts.pyages = {'pam': 24,'jim': 24,'michael': 43} print(f'Michael is {ages["michael]} years old.')这里 , 打印的f-string中对ages字典的引用缺少关键引用的双引号 。 得到的回溯结果如下:
$ python theofficefacts.pyFile "theofficefacts.py", line 7print(f'Michael is {ages["michael]} years old.')^SyntaxError: f-string: unterminated stringPython识别问题并告诉您它存在于f-string中 。 消息“未终止字符串”也指出了问题所在 。 本例中的插入符号仅指向f-string的开头 。
当插入符号指向f-string的问题区域时 , 这可能没有那么有用 , 但是它确实缩小了您需要查找的范围 。 在那个f字串的某个地方有一个未终止的字符串 。 你只需要找到在哪里 。 要修复此问题 , 请确保所有内部f-string引号和方括号都已存在 。
缺少括号和方括号的情况大致相同 。 例如 , 如果您从列表中删除了右方括号 , 那么Python将会发现并指出它 。 然而 , 这有一些变化 。 第一种是把列表中的右括号去掉:
# missing.pydef foo():return [1, 2, 3print(foo())当你运行这段代码时 , 你会被告知调用print()有一个问题:
$ python missing.pyFile "missing.py", line 5print(foo())^SyntaxError: invalid syntax这里发生的是Python认为列表包含三个元素:1、2和3 print(foo()) 。 Python使用空格从逻辑上对事物进行分组 , 因为从print(foo())中没有逗号或括号分隔3 , 所以Python将它们集中在一起作为列表的第三个元素 。
另一种变化是在列表的最后一个元素后面添加一个逗号 , 同时仍然去掉右方括号:
# missing.pydef foo():return [1, 2, 3,print(foo())现在你得到了一个不同的回溯:
$ python missing.pyFile "missing.py", line 6^SyntaxError: unexpected EOF while parsing在前面的例子中 , 3和print(foo())被集中在一起作为一个元素 , 但是在这里你可以看到一个逗号将两者分开 。 现在 , print(foo())的调用被添加为列表的第四个元素 , Python到达了文件的末尾 , 但没有使用右括号 。 回溯告诉您 , Python已经到达了文件(EOF)的末尾 , 但是它还在期待其他内容 。
在本例中 , Python希望有一个右括号(]) , 但是重复的行和插入符号没有多大帮助 。 缺少括号和方括号是Python很难识别的 。 有时 , 您唯一能做的就是从插入符号开始 , 然后向后移动 , 直到您能够识别出缺失或错误的地方 。
更多内容 , 请访问原文:
#common-syntax-problems
结论在本教程中 , 您已经看到了SyntaxError回溯所提供的信息 。 您还看到了Python中许多常见的无效语法示例 , 以及这些问题的解决方案 。 这不仅会加快你的工作流程 , 而且还会使你成为一个更有帮助的代码审查者!