IndentationError: unindent 不匹配任何外部缩进级别

Posted

技术标签:

【中文标题】IndentationError: unindent 不匹配任何外部缩进级别【英文标题】:IndentationError: unindent does not match any outer indentation level 【发布时间】:2010-10-04 06:59:42 【问题描述】:

当我编译下面的 Python 代码时,我得到了


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

为什么?

【问题讨论】:

如果你想在计算中包含'n',可能 range(1, n+1) 会更好:-) 我遇到了同样的错误,但我碰巧在代码中向左缩进了一个方法向上,这在 的底部给出了这个错误next 方法。所以这个错误不仅可能来自混合制表符和空格。 我正在使用 Sublime Text 3。我有一个 Django 项目。我使用 View > Indentation > Intent Using Spaces 修复了错误 在 pycharm 中有这个问题,在配置中调整制表符和间距不起作用。问题是我有一个覆盖 pycharm 配置的 ~/.editorconfig 文件。 我发现使用 IDLE 可以更轻松地找到缩进问题。它会清楚地发现大多数编辑不会发现的缩进错误。 【参考方案1】:

由于另一件事,我遇到了同样的错误,这与制表符与空格无关。我的第一个ifelse: 的缩进要低得多。如果它只有一两个空格,您可能会在一段长代码块后对其进行监督。与文档字符串相同:

"""comment comment 
comment
"""

它们还需要对齐,请参阅此处同一页面上的other answer。

只需几行即可重现:

if a==1:
    print('test')
 else:
    print('test2')

投掷:

  File "<ipython-input-127-52bbac35ad7d>", line 3
    else:
         ^
IndentationError: unindent does not match any outer indentation level

【讨论】:

【参考方案2】:

如果你使用colab,那么你可以通过这个命令来避免错误。

所有 [space] 缩进转换为 [tab] 缩进。然后OK。

【讨论】:

【参考方案3】:

我今天遇到了这个问题,没有看到我犯的错误,所以我想我会添加它 - 也许可以节省其他人几个小时 :)

我在我的函数中使用回车,在这种情况下,空白行没有正确缩进。这导致 Python 抛出此错误并退出。

【讨论】:

【参考方案4】:

尝试使用其他编辑器打开文件并检查行的组织方式是否存在任何问题。

【讨论】:

【参考方案5】:

我在 Ubuntu 操作系统中使用 Sublime text。要解决此问题,请转到

查看 -> 缩进 -> 将缩进转换为制表符

【讨论】:

【参考方案6】:

使用 Visual Studio 代码

如果您使用的是 vs 代码,它将使用以下简单步骤将所有混合缩进转换为空格或制表符。

    Ctrl + Shift + p

    输入indent using spaces

    Enter

【讨论】:

谢谢!短而甜!这对我有用。【参考方案7】:

即使我的代码中没有任何制表符,我也会收到此错误,原因是我的代码中某处有一个多余的右括号。我应该早点弄清楚这一点,因为它在一些等号之前和之后弄乱了空格......如果即使在你的 IDE 中运行Reformat code(或手动运行 autopep8)之后发现任何问题,请确保所有括号匹配,从第一个等号之前/之后的奇怪空格向后开始。

【讨论】:

【参考方案8】:

我正在使用带有 Flask 项目的 Sublime Text 3。我使用 View > Indentation > Tab Width: 4 after unselected Indent Using Spaces 修复了错误

【讨论】:

【参考方案9】:

例如:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

在这段代码中,我也遇到了同样的情况。只需删除之前的缩进空格 第 2 行和第 3 行,然后 使用制表符或空格。切勿同时使用两者。在 python 中编写代码时给予适当的缩进。 对于 Spyder 转到源 > 修复缩进。 VC 代码和 sublime text 或任何其他编辑器也是如此。修复缩进。

【讨论】:

【参考方案10】:

对于 Spyder 用户,请转到 来源 > 修复缩进 立即解决问题

【讨论】:

带着问题来找一个好心人已经写出了解决方案真是太可爱了!【参考方案11】:

如果您使用 Python 的 IDLE 编辑器,您可以按照它在类似错误消息之一中的建议进行操作:

1) 全选,例如Ctrl + A

2) 转到格式 -> 取消标签区域

3) 仔细检查缩进是否正确,保存并重新运行程序。

我使用的是 Python 2.5.4

【讨论】:

【参考方案12】:

SPYDER 用户:我正在使用 spyder 3.3.2 和 python 3.7.1,我解决了这个问题,设置缩进以使用制表符,通过以下步骤,点击:

工具。 首选项。 编辑。 高级设置。 缩进字符 -> 制表符。

然后我使用制表键重置“未识别”行。

由于某种原因,没有这个设置,我有时会得到 ghost IndentationError。

【讨论】:

【参考方案13】:

在带有python插件的intellij中,Ctrl + Shift + Alt 重新格式化文档修复了缩进/制表符/空格问题

【讨论】:

【参考方案14】:

这主要是因为编辑器。尝试将制表符更改为空格(4)。最好的 python 友好 IDE 或编辑器是 pycharm,sublime,vim for linux。 即使我也遇到过同样的问题,后来我发现有一个编码问题。我建议你也改变你的编辑器。

【讨论】:

【参考方案15】:

不管怎样,我的文档字符串缩进太多,这也会引发同样的错误

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level

【讨论】:

这解决了我的问题【参考方案16】:

首先,提醒您有一个逻辑错误,您最好保持 result=1,否则即使在循环运行后,您的输出也会是 result=0。

其次你可以这样写:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

留下一行将告诉 python shell FOR 语句已经结束。如果您有使用 python shell 的经验,那么您可以理解为什么我们必须留下一行。

【讨论】:

【参考方案17】:

我正在使用 Jupyter 笔记本并尝试了几乎所有上述解决方案(适应我的场景)都没有用。然后我逐行删除每行的所有空格并替换为制表符。这样就解决了问题。

【讨论】:

【参考方案18】:

我定义了一个函数,但它除了它的函数 cmets 之外没有任何内容...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

它大叫:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(注意^标记指向的行是空的)

--

多种解决方案:

1:把函数注释掉

2:添加功能注释

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3:添加什么都不做的行

def foo(bar):
    0

在任何情况下,请确保使其显而易见 为什么这是一个空函数 - 为您自己或将使用您的代码的同行

【讨论】:

pass statement 在那里可能有用:)【参考方案19】:

由于我意识到没有特定于 spyder 的答案,我将添加一个: 基本上,仔细查看您的 if 语句并确保所有 ifelifelse 具有相同的间距,即它们在开始时位于同一行,如下所示:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")

【讨论】:

【参考方案20】:

其他海报可能是正确的...您的标签中可能混有空格。尝试进行搜索和替换以用几个空格替换所有选项卡。

试试这个:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)

【讨论】:

是的,我必须在最后两行的内部循环部分上留出空间(仅在 SO 中)。不知道为什么... 我的第一行,“result = 0”(应该是 1,感谢纠正)被隔开,而其余的被标签,该死,不知道 python 是这样的 是的,这可能很棘手。我使用 emacs 来编辑 python,并且我将它设置为始终用 py 文件中的空格替换制表符,所以我没有这个问题。 Notepad++ 可能也有这样的选项。 atm 遇到同样的问题 :)。 SublimeText 将空格显示为点,非常有用。 我想知道为什么开发人员不尝试修复此错误。当配置已经提到 tabs=4 个空格时,它是没用的。所以,两者都应该随时工作。现在是 2018 年【参考方案21】:

重要提示空格是首选方法 - 请参阅 PEP008 Indentation 和 Tabs or Spaces?。 (感谢@Siha。)

Sublime Text 用户:

设置Sublime Text 使用制表符进行缩进: View --> Indentation --> Convert Indentation to Tabs

在上面的同一个子菜单中取消选中Indent Using Spaces 选项。 这将立即解决此问题。

【讨论】:

无论何时使用 Python,请确保在您使用的任何 IDE/文本编辑器中设置类似的选项 同样在 ATOM、包 > 空白 > 将空格转换为制表符,您将避免 Python 的语法错误头痛! 空格是首选方法 - 请参阅 PEP008 Indentation 和 Tabs or Spaces?。 Sublime 也可以通过这种方式进行设置。 您说空格是首选方法,但您的回答要求人们要求 sublime 使用制表符!我很困惑 @NunoCalaim 不幸的是,这发生在我回答问题之后。如果您正在开始一个新项目,请使用首选的空格技术。这就是为什么我用粗体进行了编辑,以便任何新人都知道免责声明。【参考方案22】:

如果你使用Sublime text进行python开发,可以通过使用Anaconda包来避免报错。安装Anaconda后,

    在 sublime 中打开你的文件 右键单击空白处 选择蟒蛇 点击自动格式化 完成或按 CTRL+ALT+R。

【讨论】:

【参考方案23】:

只是一个补充。我在 Notepad++ 中的两个缩进都有类似的问题。

    无例外的缩进

    外部缩进级别

    转到---->搜索选项卡---->点击替换 ---->点击下面的单选按钮扩展 --->现在将 \t 替换为四个空格

    转到---->搜索选项卡---->点击替换 ---->点击下面的单选按钮扩展 --->现在将 \n 替换为空

【讨论】:

【参考方案24】:

对于 Atom 用户,Packages -&gt;whitspace -&gt; remove trailing whitespaces 这对我有用

【讨论】:

【参考方案25】:

如果您使用的是 Vim,请点击 escape 然后输入

gg=G

此自动缩进所有内容并将清除您输入的所有空格。

【讨论】:

【参考方案26】:

开启Atom

Packages > Whitespace > Convert Spaces to Tabs

然后再次检查您的文件缩进:

python -m tabnanny yourFile.py

>python
>>> help("yourFile.py")

【讨论】:

【参考方案27】:

如果您使用 Komodo 编辑器,您可以按照它在类似错误消息之一中的建议进行操作:

1) 全选,例如Ctrl + A

2) 转到代码 -> 取消标签区域

3) 仔细检查您的缩进是否仍然正确,保存并重新运行您的程序。

我正在使用 Python 3.4.2

【讨论】:

【参考方案28】:

我昨天遇到了同样的问题,是缩进错误,使用的是 sublime 文本编辑器。我花了几个小时试图修复它,最后我将代码复制到 VI 文本编辑器中,它运行良好。 ps python 对空格太敏感,请确保不要混合空格和制表符。

【讨论】:

【参考方案29】:

如果您使用notepad++,请使用扩展搜索模式进行“替换”以查找\t并替换为四个空格。

【讨论】:

【参考方案30】:

在我的例子中,问题在于 Eclipse 上的 pydev 配置

【讨论】:

以上是关于IndentationError: unindent 不匹配任何外部缩进级别的主要内容,如果未能解决你的问题,请参考以下文章

IndentationError: unindent 不匹配任何外部缩进级别

IndentationError:unindent 不匹配任何外部缩进级别我啥都不懂[关闭]

IndentationError:期望在 requests.adapter 中有一个缩进块

IndentationError: expected an indented block

python中遇到的问题:IndentationError: unexpected indent

IndentationError: expected an indented block