# missing.py def foo(): return [1, 2, 3 print(foo())
当你运行这段代码时,你会被告知调用print()有一个问题:
$ python missing.py File "missing.py", line 5 print(foo()) ^ SyntaxError: invalid syntax
这里发生的是Python认为列表包含三个元素:1、2和3 print(foo())。Python使用空格从逻辑上对事物进行分组,因为从print(foo())中没有逗号或括号分隔3,所以Python将它们集中在一起作为列表的第三个元素。
另一种变化是在列表的最后一个元素后面添加一个逗号,同时仍然去掉右方括号:
# missing.py def foo(): return [1, 2, 3, print(foo())
现在你得到了一个不同的回溯:
$ python missing.py File "missing.py", line 6 ^ SyntaxError: unexpected EOF while parsing
在前面的例子中,3和print(foo())被集中在一起作为一个元素,但是在这里你可以看到一个逗号将两者分开。现在,print(foo())的调用被添加为列表的第四个元素,Python到达了文件的末尾,但没有使用右括号。回溯告诉您,Python已经到达了文件(EOF)的末尾,但是它还在期待其他内容。
在本例中,Python希望有一个右括号(]),但是重复的行和插入符号没有多大帮助。缺少括号和方括号是Python很难识别的。有时,您唯一能做的就是从插入符号开始,然后向后移动,直到您能够识别出缺失或错误的地方。
您在前面已经看到,如果将dictionary元素中的逗号去掉,可能会得到SyntaxError。Python字典的另一种无效语法形式是使用等号(=)来分隔键和值,而不是冒号:
>>>
>>> ages = {'pam'=24} File "<stdin>", line 1 ages = {'pam'=24} ^ SyntaxError: invalid syntax
同样,这个错误消息不是很有用。但是,重复的行和插入符号非常有用!他们直接指向问题人物。
如果您将Python语法与其他编程语言的语法混淆,那么这种类型的问题很常见。如果将定义字典的行为与dict()调用相混淆,也会看到这种情况。要解决这个问题,可以用冒号替换等号。你也可以切换到使用dict():
>>>
>>> ages = dict(pam=24) >>> ages {'pam': 24}
如果dict()语法更有帮助,那么可以使用它来定义字典。
SyntaxError有两个子类专门处理缩进问题:
IndentationError
TabError
其他编程语言使用花括号表示代码块,而Python使用空格。这意味着Python期望代码中的空白具有可预测性。如果代码块中有一行空格数错误,则会引发IndentationError:
1 # indentation.py 2 def foo(): 3 for i in range(10): 4 print(i) 5 print('done') 6 7 foo()
这可能很难看到,但是第5行只缩进了2个空格。它应该与for循环语句一致,也就是4个空格。幸运的是,Python可以很容易地发现这一点,并很快告诉您问题所在。
不过这里也有一点模糊。打印('done')行是打算在for循环之后还是在for循环块内部?当你运行上述代码,你会看到以下错误:
$ python indentation.py File "indentation.py", line 5 print('done') ^ IndentationError: unindent does not match any outer indentation level
虽然回溯看起来很像SyntaxError回溯,但它实际上是一个IndentationError。错误消息也非常有用。它告诉您行的缩进级别与其他任何缩进级别不匹配。换句话说,print('done')是缩进2个空格的,但是Python找不到任何其他匹配这种缩进级别的代码行。您可以通过确保代码行符合预期的缩进级别来快速修复此问题。
SyntaxError的另一种类型是TabError,只要有一行包含制表符或空格作为缩进,而文件的其余部分包含制表符或空格,就会看到TabError。这可能会隐藏起来,直到Python指出来!
如果制表符的大小与每个缩进级别中的空格数相同,那么看起来所有的行似乎都在同一级别上。然而,如果一行用空格缩进,另一行用制表符缩进,那么Python会指出这是一个问题:
1 # indentation.py 2 def foo(): 3 for i in range(10): 4 print(i) 5 print('done') 6 7 foo()
在这里,第5行是用制表符缩进的,而不是用4个空格。根据您的系统设置,这个代码块在您看来可能是完美的,也可能是完全错误的。
但是,Python会立即注意到这个问题。但在你运行代码,看看Python会告诉你什么是错误的之前,它可能会对你有帮助,看看在不同的标签宽度设置下的代码是什么样子的一个例子:
$ tabs 4 # Sets the shell tab width to 4 spaces $ cat -n indentation.py 1 # indentation.py 2 def foo(): 3 for i in range(10) 4 print(i) 5 print('done') 6 7 foo() $ tabs 8 # Sets the shell tab width to 8 spaces (standard) $ cat -n indentation.py 1 # indentation.py 2 def foo(): 3 for i in range(10) 4 print(i) 5 print('done') 6 7 foo() $ tabs 3 # Sets the shell tab width to 3 spaces $ cat -n indentation.py 1 # indentation.py 2 def foo(): 3 for i in range(10) 4 print(i) 5 print('done') 6 7 foo()
请注意上面三个示例之间的显示差异。大多数代码为每个缩进级别使用4个空格,但是第5行在所有3个示例中都使用单个选项卡。标签宽度的变化,基于标签宽度的设置:
如果制表符宽度为4,那么print语句看起来就像是在for循环之外。控制台将在循环结束时打印“done”。
如果制表符宽度是8,这是很多系统的标准,那么print语句看起来就像是在for循环中。控制台会在每个数字之后打印“done”。
如果制表符宽度为3,那么print语句看起来就不合适。在本例中,第5行与任何缩进级别不匹配。
当你运行代码,你会得到以下错误和回溯:
$ python indentation.py File "indentation.py", line 5 print('done') ^ TabError: inconsistent use of tabs and spaces in indentation
请注意TabError而不是通常的SyntaxError。Python指出问题所在,并给出有用的错误消息。它清楚地告诉您,在同一个文件中,制表符和空格用于缩进。
解决这个问题的方法是让同一Python代码文件中的所有行都使用制表符或空格,而不是同时使用制表符和空格。对于上面的代码块,修复方法是删除选项卡并用4个空格替换它,这将在For循环完成后打印“done”。
在定义或调用函数时,可能会遇到Python中无效的语法。例如,如果在函数定义的末尾使用分号而不是冒号,就会看到SyntaxError:
>>>
>>> def fun(); File "<stdin>", line 1 def fun(); ^ SyntaxError: invalid syntax
这里的回溯非常有用,插入符号直接指向问题字符。您可以通过将分号替换为冒号来清除Python中的这种无效语法。
此外,函数定义和函数调用中的关键字参数的顺序必须正确。关键字参数总是跟在位置参数之后。如果不使用此顺序,将导致SyntaxError:
>>>
>>> def fun(a, b): ... print(a, b) ... >>> fun(a=1, 2) File "<stdin>", line 1 SyntaxError: positional argument follows keyword argument
这里,同样,错误消息非常有助于准确地告诉您这行代码的错误之处。
本文地址:百科问答频道 https://www.neebe.cn/wenda/903360_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!