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

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

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


import sys


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

为啥?

2457280 次浏览

其他海报可能是正确的…可能有空格与您的标签混合在一起。尝试进行搜索并替换以用一些空格替换所有标签。

试试这个:

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)

result = result * i应该缩进(它是for循环的主体)。

或者-混合了空格和制表符

您确定没有在缩进空白中混合制表符和空格吗?(这将导致该错误。)

注意,建议您不要在Python代码中使用制表符。请参阅风格指南。您应该配置Notepad++为制表符插入空格。

每当我遇到这个错误时,这是因为我在编辑器中混淆了制表符和空格。

要轻松检查制表符/空格的问题,您实际上可以这样做:

python -m tabnanny yourfile.py

或者你可以正确设置你的编辑器:-)

看起来是缩进问题。您不必在Python中匹配花括号,但您必须匹配缩进级别。

防止空格/制表符问题的最佳方法是在文本编辑器中显示不可见的字符。这将为您提供一种快速的方法来防止和/或解决与缩进相关的错误。

此外,注入复制粘贴代码是此类问题的常见来源。

如果你使用Python的IDLE编辑器,你可以按照它在一条类似的错误消息中建议的那样做:

1)全选,例如Ctrl+一个

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

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

我正在使用Python 2.5.4

这可能是因为它上面的函数没有以相同的方式缩进。 即

class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")

这是因为制表符和空格都混淆了。 您可以删除所有空格并将其替换为制表符。

或者, 试试写这个:

#!/usr/bin/python -tt

在代码的开头。这一行解决了制表符和空格之间的任何差异。

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

重要空格是首选方法-见PEP 8缩进制表符还是空格?。(感谢@Siha。)

对于崇高文本用户:

设置崇高文本使用制表符进行缩进: 查看-->缩进-->将缩进转换为制表符

取消选中上面相同子菜单中的缩进使用空格选项。 这将立即解决此问题。

我昨天有同样的问题,这是缩进错误,是使用崇高的文本编辑器.花了我的时间试图修复它,最后我最终将代码复制到VI文本编辑器,它只是工作得很好. ps python太空格敏感,确保不要混合空间和制表符。

Atom

Packages > Whitespace > Convert Spaces to Tabs

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

python -m tabnanny yourFile.py

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

如果您使用的是Vim,请点击转义,然后键入

gg=g

这个自动缩进所有内容,并将清除您抛出的任何空格。

对于Atom用户,Packages ->whitspace -> remove trailing whitespaces 这对我很有用

只是一个补充。我在Notepad++中遇到了类似的缩进问题。

  1. 无例外缩进
  2. 外部缩进级别

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

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

由于我意识到没有特定于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!")

我定义了一个函数,但它没有任何内容除了它的函数注释…

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

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

我正在使用Jupyter笔记本,并尝试了几乎所有上述解决方案(适应我的场景)都没有用。然后我一行一行地删除每行的所有空格并替换为选项卡。这解决了问题。

首先,只是为了提醒你有一个逻辑错误,你最好保持结果=1,否则即使在循环运行后,你的输出也会是结果=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的经验,那么您可以理解为什么我们必须留下一行。

为了它的价值,我的docstring缩进太多,这也引发了同样的错误

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

IndentationError: unindent does not match any outer indentation level

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

例如:

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

在这段代码中,我也遇到了同样的情况。只需删除前面的缩进空格 第2行和第3行,然后是要么使用制表符要么使用空格永远不要同时使用。在用python编写代码时给出适当的缩进。 对于Spyder goto Source>修复缩进。VC代码和崇高文本或任何其他编辑器也是如此。修复缩进。

我在Flask项目中使用Sublime Text 3。我在未选中缩进使用空格后使用视图>缩进>制表符宽度:4修复了错误

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

使用Visual Studio代码

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

  1. Ctrl + Shift + p

  2. 类型indent using spaces

  3. Enter

我正在Ubuntu OS中使用崇高的文本。要解决此问题,请转到

视图->缩进->将缩进转换为制表符

我有同样的错误是因为另一件事,这不是制表符和空格的问题。我的第一个ifelse:的缩进略多。如果它只有一两个空格,你可能会在很长的代码块后监督它。docstring也是如此:

"""comment comment
comment
"""

它们还需要对齐,请参阅同一页上的其他答案

只需几行即可复制:

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

如果您使用colab,那么您可以通过此命令避免错误。

将所有[tab]缩进转换为[space]缩进。然后确定。

我实际上得到这个pylint从一个括号在错误的地方。

我添加这个答案是因为我花了很多时间寻找标签。 在这种情况下,它与制表符或空格无关。

    def some_instance_function(self):


json_response = self.some_other_function()


def compare_result(json_str, variable):
"""
Sub function for comparison
"""
json_value = self.json_response.get(json_str, f"{json_str} not found")


if str(json_value) != str(variable):
logging.error("Error message: %s, %s",
json_value,
variable) # <-- Putting the bracket here causes the error below
#) <-- Moving the bracket here fixes the issue
return False
return True


logging.debug("Response: %s", self.json_response)
#        ^----The pylint error reports here

我得到了下面类似的错误:

IndentationError:期望一个缩进的块

当我忘记将pass放在下面的类或函数中时,在类或函数之后编写了其他代码,如下所示:

class Person:
# pass


x = 10
def test():
# pass


x = 10

并且,当其他代码未在类或函数之后编写时,如下所示:

class Person:
# pass


# x = 10
def test():
# pass


# x = 10

我得到了下面的错误:

语法错误:解析时意外的EOF