有时候,在一个Python版本中工作得很好的代码会在一个新版本中中断。这是由于语言语法的官方变化。这方面最著名的例子是print语句,它从python2中的一个关键字变成了python3中的一个内置函数:
>>>
>>> # Valid Python 2 syntax that fails in Python 3 >>> print 'hello' File "<stdin>", line 1 print 'hello' ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?
这是SyntaxError提供的错误消息所展示的示例之一!它不仅告诉您在print调用中缺少圆括号,而且还提供了正确的代码来帮助您修复语句。
您可能会遇到的另一个问题是,当您阅读或学习在较新版本的Python中有效的语法,但在您正在编写的版本中无效的语法时。f-string语法就是一个例子,在3.6之前的Python版本中是不存在的:
>>>
>>> # Any version of python before 3.6 including 2.7 >>> w ='world' >>> print(f'hello, {w}') File "<stdin>", line 1 print(f'hello, {w}') ^ SyntaxError: invalid syntax
在3.6之前的Python版本中,解释器对f-string语法一无所知,只会提供一个通用的“无效语法”消息。在本例中,问题是代码看起来非常好,但是它是在较老版本的Python中运行的。如果有疑问,请再次检查正在运行的Python版本!
Python语法在不断发展,Python 3.8中引入了一些很酷的新特性:
Walrus操作符(赋值表达式)
用于调试的F-string语法
Positional-only参数
如果您想尝试这些新特性,那么您需要确保您是在Python 3.8环境中工作。否则,您将得到一个SyntaxError。
Python 3.8还提供了新的SyntaxWarning。在语法有效但看起来仍然可疑的情况下,您将看到此警告。例如,如果列表中的两个元组之间缺少逗号。这在3.8之前的Python版本中是有效的语法,但是代码会产生一个类型错误,因为tuple是不可调用的:
>>>
>>> [(1,2)(2,3)] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object is not callable
这个类型错误意味着您不能像调用函数那样调用元组,这是Python解释器认为您正在做的。
在Python 3.8中,这段代码仍然会引发类型错误,但是现在您还会看到一个SyntaxWarning,它指示如何着手修复问题:
>>>
>>> [(1,2)(2,3)] <stdin>:1: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma? Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object is not callable
新SyntaxWarning附带的有用信息甚至提供了一个提示(“也许您漏掉了一个逗号?”),以便为您指出正确的方向!
在本教程中,您已经看到了SyntaxError回溯所提供的信息。您还看到了Python中许多常见的无效语法示例,以及这些问题的解决方案。这不仅会加快你的工作流程,而且还会使你成为一个更有帮助的代码审查者!
在编写代码时,请尝试使用能够理解Python语法并提供反馈的IDE。如果您将本教程中的许多无效Python代码示例放到一个良好的IDE中,那么它们应该在您执行代码之前突出显示问题行。
在学习Python时获得一个SyntaxError可能会令人沮丧,但是现在您知道了如何理解回溯消息以及在Python中可能遇到的无效语法形式。下一次出现SyntaxError时,您就可以更好地快速修复这个问题了!
本文地址:百科问答频道 https://www.neebe.cn/wenda/903360_4.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!