我收到一个 IndentationError。我如何解决它?
I'm getting an IndentationError. How do I fix it?
我有一个 Python 脚本:
if True:
if False:
print('foo')
print('bar')
但是,当我尝试 运行 我的脚本时,Python 引发了 IndentationError
:
File "script.py", line 4
print('bar')
^
IndentationError: unindent does not match any outer indentation level
我一直在玩我的程序,总共产生了四个错误:
IndentationError: unexpected indent
IndentationError: expected an indented block
TabError: inconsistent use of tabs and spaces in indentation
IndentationError: unindent does not match any outer indentation level
这些错误是什么意思?我究竟做错了什么?我该如何修复我的代码?
注意:这是对canonical question because I see many similar posts every month. This is not a duplicate of existing questions about unindents or unexpected indents的一次尝试,因为它们每个只处理一种类型的缩进错误,我正在寻找将它们全部覆盖在一个地方。
为什么缩进很重要?
在Python中,缩进用于分隔blocks of code。这与许多其他使用花括号 {}
来分隔块的语言不同,例如 Java、Javascript 和 C。因此,Python 用户必须支付 close注意他们何时以及如何缩进代码,因为 whitespace 很重要。
当 Python 遇到程序缩进问题时,它会引发一个名为 IndentationError
or TabError
的异常。
一点历史
为什么 Python 使用缩进与可以说更普遍接受的花括号 {}
的历史原因在 an article of the history of Python by Guido van Rossum - Python 的创建者中概述:
Python’s use of indentation comes directly from ABC, but this idea didn’t originate with ABC--it had already been promoted by Donald Knuth and was a well-known concept of programming style. (The occam programming language also used it.) However, ABC’s authors did invent the use of the colon that separates the lead-in clause from the indented block. After early user testing without the colon, it was discovered that the meaning of the indentation was unclear to beginners being taught the first steps of programming. The addition of the colon clarified it significantly: the colon somehow draws attention to what follows and ties the phrases before and after it together in just the right way.
如何缩进我的代码?
缩进 Python 代码的基本规则(考虑到您将整个程序视为“基本块”)是:基本块中的第一条语句,以及它之后的每个后续语句都必须缩进相同数量。
所以从技术上讲,以下 Python 程序是正确的:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
但是,您可能从上面可以看出,随机缩进您的代码使得阅读和遵循程序流程非常困难。最好保持一致并遵循一种风格。
PEP 8 -- the Python style guide -- says:
Use 4 spaces per indentation level.
也就是说,开始新块的每个语句以及新块中的每个后续语句都应从当前缩进级别space缩进四 .以下是根据 PEP8 风格指南缩进的上述程序:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
我还能使用制表符吗?
Python 意识到有些人仍然更喜欢制表符而不是 spaces,并且遗留代码可能使用制表符而不是 spaces,因此它允许使用制表符作为缩进。 PEP8 touches on this topic:
Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.
但是请注意,一个重要的警告是不要同时使用制表符和 space 来缩进。这样做会导致各种奇怪的难以调试的缩进错误。 Python 将制表符扩展到下一个第 8 列,但如果您的编辑器将制表符大小设置为 4 列,或者您使用 space 和制表符,您可以轻松生成缩进代码 在你的编辑器中看起来很好,但是Python会拒绝运行。 Python 3 编译器 明确地 拒绝任何包含制表符和 space 的模糊混合的程序,通常是通过引发 TabError
。然而,默认情况下,在 Python2 中仍然允许混合制表符和 spaces,但强烈建议不要使用此“功能”。使用 -t
和 -tt
命令行标志强制 Python 2 分别发出警告或(最好)错误。 PEP8 also discusses this topic:
Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.
When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!
“缩进错误:意外缩进”是什么意思?
问题
当一个语句被不必要地缩进或者它的缩进与同一块中前面语句的缩进不匹配时,就会发生这个错误。例如,下面程序中的第一条语句不必要地缩进:
>>> print('Hello') # this is indented
File "<stdin>", line 1
print('Hello') # this is indented
^
IndentationError: unexpected indent
在此示例中,if
块中的 can_drive = True
行与任何先前语句的缩进不匹配:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # incorrectly indented
File "<stdin>", line 3
can_drive = True # incorrectly indented
^
IndentationError: unexpected indent
修复
解决此错误的方法是首先确保有问题的行甚至需要缩进。例如,上面使用 print
的示例可以通过取消缩进行来修复:
>>> print('Hello') # simply unindent the line
Hello
但是,如果您确定该行确实需要缩进,则缩进需要与同一块中前一条语句的缩进相匹配。在上面使用 if
的第二个示例中,我们可以通过确保带有 can_drive = True
的行与 if
正文中的前一个语句缩进相同的级别来修复错误:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # indent this line at the same level.
...
“IndentationError: expected an indented block”是什么意思?
(这也可能在 Python 3.8 或更低版本中作为 SyntaxError: unexpected EOF while parsing
出现。)
问题
当 Python 看到复合语句的 'header' 时会发生此错误,例如 if <condition>:
或 while <condition>:
但复合语句的主体或 block 从未定义。例如,在下面的代码中,我们开始了一个 if
语句,但我们从未为该语句定义主体:
>>> if True:
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
在第二个示例中,我们开始编写一个 for
循环,但我们忘记缩进 for
循环体。所以 Python 仍然需要 for
循环体的缩进块:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
File "<stdin>", line 2
print(name)
^
IndentationError: expected an indented block
评论不算正文:
>>> if True:
... # TODO
...
File "<stdin>", line 3
^
IndentationError: expected an indented block
修复
此错误的修复方法是简单地包含复合语句的主体。
如上所示,新用户的一个常见错误是他们忘记缩进正文。如果是这种情况,请确保要包含在复合语句正文中的每个语句都缩进到复合语句开头下方的同一级别。这里是上面的例子固定:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name) # The for loop body is now correctly indented.
...
sarah
lucy
michael
另一种常见情况是,出于某种原因,用户可能不想为复合语句定义实际主体,或者主体可能被注释掉。在这种情况下,pass
statement can be used. The pass
statement can be used anywhere Python expects one or more statements as a placeholder. From the documentation for pass
:
pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed, for example:
def f(arg): pass # a function that does nothing (yet)
class C: pass # a class with no methods (yet)
这是上面的示例,其中 if
语句通过使用 pass
关键字修复:
>>> if True:
... pass # We don't want to define a body.
...
>>>
“IndentationError: unindent does not match any outer indentation level”是什么意思?
问题
当您取消缩进语句时会发生此错误,但现在该语句的缩进级别与之前任何语句的缩进级别都不匹配。例如,在下面的代码中,我们取消了对 print
的第二次调用。但是,缩进级别与之前任何语句的缩进级别都不匹配:
>>> if True:
... if True:
... print('yes')
... print()
File "<stdin>", line 4
print()
^
IndentationError: unindent does not match any outer indentation level
这个错误特别难以捕捉,因为即使是一个 space 也会导致您的代码失败。
修复
修复是为了确保当您取消缩进语句时,缩进级别与先前语句的缩进级别相匹配。再次考虑上面的例子。在示例中,我希望对 print 的第二次调用位于第一个 if
语句主体中。所以我需要确保该行的缩进级别与第一个 if
语句正文中的前一个语句的缩进级别相匹配:
>>> if True:
... if True:
... print('yes')
... print() # indentation level now matches former statement's level.
...
yes
>>>
我仍然收到 IndentationError,但我的程序似乎已正确缩进。我该怎么办?
如果您的程序在视觉上看起来有正确的缩进,但您仍然得到 IndentationError
,您很可能 混合了 spaces 的制表符。这有时会导致 Python 引发奇怪的错误。请参阅 特殊情况 小节 “TabError:不一致使用制表符和 spaces in indentation" 是什么意思? 以获得更深入的问题解释。
“TabError:缩进中制表符和 space 的使用不一致”是什么意思?
问题
此错误仅在您尝试混合使用制表符和 space 作为缩进字符时发生。如上所述,Python 将不允许您的程序包含制表符和 space 的混合,如果发现有,则会引发特定异常 TabError
。例如,在下面的程序中,制表符和 spaces 的混合用于缩进:
>>> if True:
... if True:
... print()
... print()
... print()
File "<stdin>", line 5
print()
^
TabError: inconsistent use of tabs and spaces in indentation
这里有一张图片直观地显示了上面程序中的白色space。灰色点是 spaces,灰色箭头是制表符:
我们可以看到我们确实混合了 space 和制表符进行缩进。
特例
注意Python不会总是提出TabError
如果您将制表符和 space 混合到您的程序中。如果程序缩进是明确的,Python 将允许制表符和 space 混合使用。例如:
>>> if True:
... if True: # tab
... pass # tab, then 4 spaces
...
>>>
有时 Python 会因混合使用制表符和 space 而错误地引发 IndentationError
异常,而 TabError
更合适。另一个例子:
>>> if True:
... pass # tab
... pass # 4 spaces
File "<stdin>", line 3
pass # 4 spaces
^
IndentationError: unindent does not match any outer indentation level
如您所见,运行以这种方式编写代码会产生神秘的错误。尽管程序 视觉上 看起来不错,但 Python 在尝试解析用于缩进的制表符和 space 时感到困惑并出错。
这些很好的例子说明了为什么在使用 Python 2 时永远不要混合制表符和 space 并使用 -t
和 -tt
解释器标志。
修复
如果您的程序很短,最简单和最快捷的解决方法可能就是简单地重新缩进程序。确保每个语句每个缩进级别缩进四个 space(请参阅 How do I indent my code?)。
但是,如果您已经有一个混合制表符和 space 的大型程序,可以使用自动化工具将所有缩进转换为 space s.
许多编辑器(例如 PyCharm and SublimeText have options to automatically convert tabs to spaces. There are also several on-line tools such as Tabs To Spaces or Browserling that allow you to quickly re-indent your code. There are also tools written in Python. autopep8)可以自动重新缩进您的代码并修复其他缩进错误。
即使是最好的工具有时也无法修复所有的缩进错误,您必须手动修复它们。这就是为什么从一开始就正确缩进代码很重要。
关于“SyntaxError”相关缩进问题的说明
虽然不经常,但有时某些 SyntaxError
异常是由于不正确的缩进而引发的。例如,看下面的代码:
if True:
pass
pass # oops! this statement should be indented!.
else:
pass
当上面代码为运行时,抛出一个SyntaxError
:
Traceback (most recent call last):
File "python", line 4
else:
^
SyntaxError: invalid syntax
虽然 Python 引发了 SyntaxError
,但上面代码的 真正的 问题是第二个 pass
语句应该缩进。因为第二个 pass
没有缩进,所以 Python 没有意识到前面的 if
语句和 else
语句是要连接的。
解决此类错误的方法是简单地正确地重新缩进您的代码。要了解如何正确缩进您的代码,请参阅 我如何缩进我的代码?.
部分
我仍然对 Python 的缩进语法感到困惑。我该怎么办?
如果您还在挣扎,请不要气馁。可能需要时间来适应
Python 的白space 语法规则。以下是一些有用的提示:
- 获得一个编辑器,它会在您遇到缩进错误时告诉您。部分货如上,PyCharm, SublimeText, and Jupyter Notebook.
- 缩进代码时,请自己大声数出按 space 栏(或 Tab 键)的次数。例如,如果你需要将一行缩进四 space,你会大声说“one, two, three, four" 同时每次按下 space-bar。这听起来很傻,但它有助于训练您的大脑思考您将代码缩进了多深。
- 如果您有编辑器,请查看它是否有自动将制表符转换为 spaces 的选项。
- 查看别人的代码。浏览 github or Whosebug 并查看 Python 代码示例。
- 随便写代码。这是变得更好的唯一最佳方法。 Python 代码写的越多,你就会越好。
已用资源
你看,你有一个小错误。
if True:
if False:
print('foo')
print('bar')
你应该做的:
if True:
if False:
print('foo')
print('bar')
如您所见,您的打印仅缩进了 3 个空格,它应该缩进 4 个空格。
Sublime 用户的快速修复:
- 按 Ctrl-H 访问查找和替换
- 在查找中:键入 4 个空格
- In Replace:从代码中的某处复制并粘贴制表符
单击全部替换
崇高文本 3
如果您碰巧在 Sublime Text 3 中编写代码,这可以帮助您解决缩进问题
在 Sublime Text 中编辑 Python 文件时:
Sublime Text 菜单 > 首选项 > 设置 - 特定语法:
Python.sublime-设置
{
"tab_size": 4,
"translate_tabs_to_spaces": true
}
我有一个 Python 脚本:
if True:
if False:
print('foo')
print('bar')
但是,当我尝试 运行 我的脚本时,Python 引发了 IndentationError
:
File "script.py", line 4
print('bar')
^
IndentationError: unindent does not match any outer indentation level
我一直在玩我的程序,总共产生了四个错误:
IndentationError: unexpected indent
IndentationError: expected an indented block
TabError: inconsistent use of tabs and spaces in indentation
IndentationError: unindent does not match any outer indentation level
这些错误是什么意思?我究竟做错了什么?我该如何修复我的代码?
注意:这是对canonical question because I see many similar posts every month. This is not a duplicate of existing questions about unindents or unexpected indents的一次尝试,因为它们每个只处理一种类型的缩进错误,我正在寻找将它们全部覆盖在一个地方。
为什么缩进很重要?
在Python中,缩进用于分隔blocks of code。这与许多其他使用花括号 {}
来分隔块的语言不同,例如 Java、Javascript 和 C。因此,Python 用户必须支付 close注意他们何时以及如何缩进代码,因为 whitespace 很重要。
当 Python 遇到程序缩进问题时,它会引发一个名为 IndentationError
or TabError
的异常。
一点历史
为什么 Python 使用缩进与可以说更普遍接受的花括号 {}
的历史原因在 an article of the history of Python by Guido van Rossum - Python 的创建者中概述:
Python’s use of indentation comes directly from ABC, but this idea didn’t originate with ABC--it had already been promoted by Donald Knuth and was a well-known concept of programming style. (The occam programming language also used it.) However, ABC’s authors did invent the use of the colon that separates the lead-in clause from the indented block. After early user testing without the colon, it was discovered that the meaning of the indentation was unclear to beginners being taught the first steps of programming. The addition of the colon clarified it significantly: the colon somehow draws attention to what follows and ties the phrases before and after it together in just the right way.
如何缩进我的代码?
缩进 Python 代码的基本规则(考虑到您将整个程序视为“基本块”)是:基本块中的第一条语句,以及它之后的每个后续语句都必须缩进相同数量。
所以从技术上讲,以下 Python 程序是正确的:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
但是,您可能从上面可以看出,随机缩进您的代码使得阅读和遵循程序流程非常困难。最好保持一致并遵循一种风格。
PEP 8 -- the Python style guide -- says:
Use 4 spaces per indentation level.
也就是说,开始新块的每个语句以及新块中的每个后续语句都应从当前缩进级别space缩进四 .以下是根据 PEP8 风格指南缩进的上述程序:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
我还能使用制表符吗?
Python 意识到有些人仍然更喜欢制表符而不是 spaces,并且遗留代码可能使用制表符而不是 spaces,因此它允许使用制表符作为缩进。 PEP8 touches on this topic:
Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.
但是请注意,一个重要的警告是不要同时使用制表符和 space 来缩进。这样做会导致各种奇怪的难以调试的缩进错误。 Python 将制表符扩展到下一个第 8 列,但如果您的编辑器将制表符大小设置为 4 列,或者您使用 space 和制表符,您可以轻松生成缩进代码 在你的编辑器中看起来很好,但是Python会拒绝运行。 Python 3 编译器 明确地 拒绝任何包含制表符和 space 的模糊混合的程序,通常是通过引发 TabError
。然而,默认情况下,在 Python2 中仍然允许混合制表符和 spaces,但强烈建议不要使用此“功能”。使用 -t
和 -tt
命令行标志强制 Python 2 分别发出警告或(最好)错误。 PEP8 also discusses this topic:
Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.
When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!
“缩进错误:意外缩进”是什么意思?
问题
当一个语句被不必要地缩进或者它的缩进与同一块中前面语句的缩进不匹配时,就会发生这个错误。例如,下面程序中的第一条语句不必要地缩进:
>>> print('Hello') # this is indented
File "<stdin>", line 1
print('Hello') # this is indented
^
IndentationError: unexpected indent
在此示例中,if
块中的 can_drive = True
行与任何先前语句的缩进不匹配:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # incorrectly indented
File "<stdin>", line 3
can_drive = True # incorrectly indented
^
IndentationError: unexpected indent
修复
解决此错误的方法是首先确保有问题的行甚至需要缩进。例如,上面使用 print
的示例可以通过取消缩进行来修复:
>>> print('Hello') # simply unindent the line
Hello
但是,如果您确定该行确实需要缩进,则缩进需要与同一块中前一条语句的缩进相匹配。在上面使用 if
的第二个示例中,我们可以通过确保带有 can_drive = True
的行与 if
正文中的前一个语句缩进相同的级别来修复错误:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # indent this line at the same level.
...
“IndentationError: expected an indented block”是什么意思?
(这也可能在 Python 3.8 或更低版本中作为 SyntaxError: unexpected EOF while parsing
出现。)
问题
当 Python 看到复合语句的 'header' 时会发生此错误,例如 if <condition>:
或 while <condition>:
但复合语句的主体或 block 从未定义。例如,在下面的代码中,我们开始了一个 if
语句,但我们从未为该语句定义主体:
>>> if True:
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
在第二个示例中,我们开始编写一个 for
循环,但我们忘记缩进 for
循环体。所以 Python 仍然需要 for
循环体的缩进块:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
File "<stdin>", line 2
print(name)
^
IndentationError: expected an indented block
评论不算正文:
>>> if True:
... # TODO
...
File "<stdin>", line 3
^
IndentationError: expected an indented block
修复
此错误的修复方法是简单地包含复合语句的主体。
如上所示,新用户的一个常见错误是他们忘记缩进正文。如果是这种情况,请确保要包含在复合语句正文中的每个语句都缩进到复合语句开头下方的同一级别。这里是上面的例子固定:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name) # The for loop body is now correctly indented.
...
sarah
lucy
michael
另一种常见情况是,出于某种原因,用户可能不想为复合语句定义实际主体,或者主体可能被注释掉。在这种情况下,pass
statement can be used. The pass
statement can be used anywhere Python expects one or more statements as a placeholder. From the documentation for pass
:
pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed, for example:
def f(arg): pass # a function that does nothing (yet) class C: pass # a class with no methods (yet)
这是上面的示例,其中 if
语句通过使用 pass
关键字修复:
>>> if True:
... pass # We don't want to define a body.
...
>>>
“IndentationError: unindent does not match any outer indentation level”是什么意思?
问题
当您取消缩进语句时会发生此错误,但现在该语句的缩进级别与之前任何语句的缩进级别都不匹配。例如,在下面的代码中,我们取消了对 print
的第二次调用。但是,缩进级别与之前任何语句的缩进级别都不匹配:
>>> if True:
... if True:
... print('yes')
... print()
File "<stdin>", line 4
print()
^
IndentationError: unindent does not match any outer indentation level
这个错误特别难以捕捉,因为即使是一个 space 也会导致您的代码失败。
修复
修复是为了确保当您取消缩进语句时,缩进级别与先前语句的缩进级别相匹配。再次考虑上面的例子。在示例中,我希望对 print 的第二次调用位于第一个 if
语句主体中。所以我需要确保该行的缩进级别与第一个 if
语句正文中的前一个语句的缩进级别相匹配:
>>> if True:
... if True:
... print('yes')
... print() # indentation level now matches former statement's level.
...
yes
>>>
我仍然收到 IndentationError,但我的程序似乎已正确缩进。我该怎么办?
如果您的程序在视觉上看起来有正确的缩进,但您仍然得到 IndentationError
,您很可能 混合了 spaces 的制表符。这有时会导致 Python 引发奇怪的错误。请参阅 特殊情况 小节 “TabError:不一致使用制表符和 spaces in indentation" 是什么意思? 以获得更深入的问题解释。
“TabError:缩进中制表符和 space 的使用不一致”是什么意思?
问题
此错误仅在您尝试混合使用制表符和 space 作为缩进字符时发生。如上所述,Python 将不允许您的程序包含制表符和 space 的混合,如果发现有,则会引发特定异常 TabError
。例如,在下面的程序中,制表符和 spaces 的混合用于缩进:
>>> if True:
... if True:
... print()
... print()
... print()
File "<stdin>", line 5
print()
^
TabError: inconsistent use of tabs and spaces in indentation
这里有一张图片直观地显示了上面程序中的白色space。灰色点是 spaces,灰色箭头是制表符:
我们可以看到我们确实混合了 space 和制表符进行缩进。
特例
注意Python不会总是提出TabError
如果您将制表符和 space 混合到您的程序中。如果程序缩进是明确的,Python 将允许制表符和 space 混合使用。例如:
>>> if True:
... if True: # tab
... pass # tab, then 4 spaces
...
>>>
有时 Python 会因混合使用制表符和 space 而错误地引发 IndentationError
异常,而 TabError
更合适。另一个例子:
>>> if True:
... pass # tab
... pass # 4 spaces
File "<stdin>", line 3
pass # 4 spaces
^
IndentationError: unindent does not match any outer indentation level
如您所见,运行以这种方式编写代码会产生神秘的错误。尽管程序 视觉上 看起来不错,但 Python 在尝试解析用于缩进的制表符和 space 时感到困惑并出错。
这些很好的例子说明了为什么在使用 Python 2 时永远不要混合制表符和 space 并使用 -t
和 -tt
解释器标志。
修复
如果您的程序很短,最简单和最快捷的解决方法可能就是简单地重新缩进程序。确保每个语句每个缩进级别缩进四个 space(请参阅 How do I indent my code?)。
但是,如果您已经有一个混合制表符和 space 的大型程序,可以使用自动化工具将所有缩进转换为 space s.
许多编辑器(例如 PyCharm and SublimeText have options to automatically convert tabs to spaces. There are also several on-line tools such as Tabs To Spaces or Browserling that allow you to quickly re-indent your code. There are also tools written in Python. autopep8)可以自动重新缩进您的代码并修复其他缩进错误。
即使是最好的工具有时也无法修复所有的缩进错误,您必须手动修复它们。这就是为什么从一开始就正确缩进代码很重要。
关于“SyntaxError”相关缩进问题的说明
虽然不经常,但有时某些 SyntaxError
异常是由于不正确的缩进而引发的。例如,看下面的代码:
if True:
pass
pass # oops! this statement should be indented!.
else:
pass
当上面代码为运行时,抛出一个SyntaxError
:
Traceback (most recent call last):
File "python", line 4
else:
^
SyntaxError: invalid syntax
虽然 Python 引发了 SyntaxError
,但上面代码的 真正的 问题是第二个 pass
语句应该缩进。因为第二个 pass
没有缩进,所以 Python 没有意识到前面的 if
语句和 else
语句是要连接的。
解决此类错误的方法是简单地正确地重新缩进您的代码。要了解如何正确缩进您的代码,请参阅 我如何缩进我的代码?.
部分我仍然对 Python 的缩进语法感到困惑。我该怎么办?
如果您还在挣扎,请不要气馁。可能需要时间来适应 Python 的白space 语法规则。以下是一些有用的提示:
- 获得一个编辑器,它会在您遇到缩进错误时告诉您。部分货如上,PyCharm, SublimeText, and Jupyter Notebook.
- 缩进代码时,请自己大声数出按 space 栏(或 Tab 键)的次数。例如,如果你需要将一行缩进四 space,你会大声说“one, two, three, four" 同时每次按下 space-bar。这听起来很傻,但它有助于训练您的大脑思考您将代码缩进了多深。
- 如果您有编辑器,请查看它是否有自动将制表符转换为 spaces 的选项。
- 查看别人的代码。浏览 github or Whosebug 并查看 Python 代码示例。
- 随便写代码。这是变得更好的唯一最佳方法。 Python 代码写的越多,你就会越好。
已用资源
你看,你有一个小错误。
if True:
if False:
print('foo')
print('bar')
你应该做的:
if True:
if False:
print('foo')
print('bar')
如您所见,您的打印仅缩进了 3 个空格,它应该缩进 4 个空格。
Sublime 用户的快速修复:
- 按 Ctrl-H 访问查找和替换
- 在查找中:键入 4 个空格
- In Replace:从代码中的某处复制并粘贴制表符 单击全部替换
崇高文本 3
如果您碰巧在 Sublime Text 3 中编写代码,这可以帮助您解决缩进问题
在 Sublime Text 中编辑 Python 文件时:
Sublime Text 菜单 > 首选项 > 设置 - 特定语法:
Python.sublime-设置
{
"tab_size": 4,
"translate_tabs_to_spaces": true
}