我应该如何处理 Python 中的“意外缩进”?

如何纠正 Python 中的错误“意外缩进”?

1164278 次浏览

通过使用正确的缩进。Python 支持空格,因此您需要遵循它的块缩进指南,否则您将得到缩进错误。

在 Python 中,间距非常重要,这给出了代码块的结构。

当您搞乱代码结构时,就会发生这种错误,例如:

def test_function():
if 5 > 3:
print "hello"

您的文件中还可能混合了制表符和空格。

我建议您使用 Python 语法感知编辑器,如 PyScripterNetBeans

Python 使用行首的间距来确定代码块的开始和结束时间。你可能遇到的错误是:

意想不到的缩进。这行代码的开始部分比前一行有更多的空格,但前一行不是子块的开始部分(例如,如果同时为了语句)。块中的所有代码行必须以完全相同的空格字符串开始。例如:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

在以交互方式运行 Python 时,这种情况尤其常见: 确保在命令之前不要放置任何额外的空格。(复制粘贴示例代码时非常烦人!)

>>>   print "hello"
IndentationError: unexpected indent

取消缩进与任何外部缩进级别都不匹配。这行代码在开始部分的空格比前一行少,但是同样它不匹配它可能成为其中一部分的任何其他块。Python 无法决定它的去向。例如,在下面的例子中,最终打印是否应该是 if 子句的一部分?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

我以为会有一个缩进的块。这行代码的起始空格数与前一行相同,但最后一行需要启动一个块(例如,如果同时为了语句或函数定义)。

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

如果你想要一个什么都不做的函数,使用“ no-op”命令 通过:

>>> def foo():
...     pass

允许混合制表符和空格(至少在我的 Python 版本中是这样) ,但 Python 假设制表符长度为8个字符,这可能与您的编辑器不匹配。不要把制表符和空格混在一起。大多数编辑器允许自动替换一个与其他。如果您在一个团队中,或者正在从事一个开源项目,看看他们更喜欢哪一个。

避免这些问题的最佳方法是在缩进子块时始终使用一致数量的空格,最好使用能够解决问题的好的 IDE。这也将使您的代码更具可读性。

如果缩进看起来没问题,那么看看你的编辑器是否有“查看空格”选项。启用此选项卡可以查找空格和制表符的混合位置。

有一招对我一直很管用:

如果您得到了一个意外的缩进,并且您看到所有代码都完全缩进了,那么尝试用另一个编辑器打开它,您将看到哪一行代码没有缩进。

当我使用 维姆Gedit或类似的编辑器时,这种情况就发生了。

尝试只对代码使用 编辑器。

在你正在使用的编辑器中打开 可见的空白,然后打开 用空格替换制表符

虽然可以在 Python 中使用制表符,但混合使用制表符和空格通常会导致出现错误。用四个空格替换制表符是编写 Python 代码的推荐方法。

使用 选项运行代码,以查明是否使用了不一致的制表符和空格。

确保在编辑器中使用选项 “插入空格而不是制表符”。然后您可以选择您想要的制表符宽度,例如4。你可以在菜单 剪辑偏好编辑Gedit中找到这些选项。

底线是: 使用空格,不是制表符

Notepad + + 正在修正制表符空间,但是在 崇高的文字编辑器中最终发现了缩进问题。

使用“崇高文本”编辑器,一行一行地查看。

只要复制你的脚本,并把它放在“你的整个代码”..。

在变量中指定此行,如,

a = """ your Python script """


print a.replace("Here please press the tab button. It will insert some space", " here simply press the space bar four times.")
#
# Here we are replacing tab space by four character
# space as per the PEP 8 style guide...
#
# Now execute this code. In the Sublime Text
# editor use Ctrl + B. Now it will print
# indented code in the console. That's it.

在将某些内容粘贴到 Python 解释器(终端/控制台)中时,也可能发生此错误。

注意,解释器将空行解释为表达式的结尾,因此如果您粘贴类似于

def my_function():
x = 3


y = 7

解释器将把 y = 7之前的空行解释为表达式的结尾,也就是说,您已经完成了对函数的定义,下一行-y = 7将有不正确的缩进,因为它是一个新的表达式。

如果您正在使用 崇高的文字编写 Python 并且遇到缩进错误,

菜单 观景压痕将缩进转换为空格

我所描述的问题是由崇高文本编辑器引起的。同样的问题也可能由其他编辑引起。从本质上讲,这个问题与 Python 希望按空格处理缩进,而不是按制表符编码缩进的各种编辑器有关。

有一个问题似乎没有被提及,那就是由于与缩进无关的代码出现问题,可能会突然出现这个错误。

例如,以下面的脚本为例:

def add_one(x):
try:
return x + 1
add_one(5)

当问题当然是缺少的 except:语句时,返回一个 IndentationError: unexpected unindent

我的观点是: 检查上面报告意外缩进的代码!

您所需要做的就是从以下代码的开头删除空格或制表符空格:

from django.contrib import admin


# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

在 Python 中,缩进 很重要,但是与其他许多编程语言不同,这不是为了代码的可读性。

如果在连续命令之间的代码中有任何空格或制表符,Python 将给出这个错误,因为 Python 对此很敏感。当我们将代码复制粘贴到任何 Python 时,很可能会得到这个错误。

确保使用诸如 记事本 + + 之类的文本编辑器将这些空格 识别并移除,或者手动删除代码行中出现错误的空格。

# Step 1: Gives an error
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])


# Step 2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])


# Step 3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
# Output: [[7, 8, 9, 10]]

运行以下命令来解决这个问题:

autopep8 -i <filename>.py

这将更新代码并解决所有缩进错误:)

这取决于具体情况。下面是另一个尚未涉及的场景。假设您有一个文件,其中包含一个具有特定方法的类

class Scraper:
def __init__(self):
pass


def scrape_html(self, html: str):
pass

在文件的底部,你可以看到

if __name__ == "__main__":
# some
# commands
# doing
# stuff

让整个文件看起来像这样

class Scraper:
def __init__(self):
pass


def scrape_html(self, html: str):
pass


if __name__ == "__main__":
# some
# commands
# doing
# stuff

例如,如果在 scrape _ html ()中打开一个 If/else 语句

class Scraper:
def __init__(self):
pass


def scrape_html(self, html: str):
if condition:
pass
else:


if __name__ == "__main__":
parser = argparse.ArgumentParser()

您需要添加 pass或任何您想要添加到 else 语句中,否则您将得到

预期缩进块

enter image description here

没有缩进

enter image description here

预期的表情

enter image description here

坐在第一排

意想不到的凹痕

enter image description here

添加 pass将解决所有这四个问题。

这取决于上下文,但缩进错误通常是由使用制表符而不是空格造成的。

你可以采取以下步骤来纠正这个问题:

  1. 复制导致错误的选项卡或空格

  2. 在 IDE 中执行查找和替换操作(通常是 Ctrl + H)。

  3. 将复制的选项卡或空格粘贴到“查找”搜索栏中,然后将它们全部替换为四个空格(假设 IDE 使用四个空格作为“良好”缩进)

如果要将外部源代码复制并粘贴到 IDE 中,这种错误也经常发生,因为其他地方的格式可能不符合“良好”缩进的 IDE 定义。