【问题标题】:What should I do with "Unexpected indent" in Python?我应该如何处理 Python 中的“意外缩进”?
【发布时间】:2022-05-22 07:00:57
【问题描述】:

如何纠正 Python 中的错误“unexpected indent”?

【问题讨论】:

  • 产生错误的代码片段将帮助我们更好地理解您的问题。请编辑您的问题以包含一些代码。
  • 这对我来说听起来像是一个空白问题,所以代码示例将毫无用处。
  • 问题含糊,没有选择答案。
  • “我该如何纠正错误...”?通过确定错误发生的位置并修复错误原因。在这种情况下,通过使该特定行的缩进看起来像 Python 所期望的那样......
  • @baptx 在每种带有大括号的语言中,编码人员最终都会采用格式规则,无论如何他们都会缩进 if/else 块,并且当缩进和大括号错误地错位时,就会引入主要错误。 Python 可以防止此类错误。将来,如果您不想重新缩进嵌套代码,我建议您通过在条件前面加上“true or (...)”来“注释掉”您的 if。这与评论的效果完全相同。

标签: python indentation


【解决方案1】:

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

意外缩进。这行代码的开头比前一行有更多的空格,但前一行不是子块的开头(例如,ifwhilefor 语句)。块中的所有代码行必须以完全相同的空白字符串开头。例如:

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

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

>>>   print "hello"
IndentationError: unexpected indent

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

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

需要一个缩进块。这行代码在开头的空格数与前一行相同,但最后一行应该开始一个块(例如,if whilefor 语句或函数定义)。

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

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

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

允许混合制表符和空格(至少在我的 Python 版本中),但 Python 假定制表符长度为 8 个字符,这可能与您的编辑器不匹配。 对标签说“不”。大多数编辑器允许它们自动替换为空格。

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

【讨论】:

  • 很好的解释。除此之外,我还在NotePad ++中将空格与'tab'和'space bar'混合时,我还花费了indent Unexpected error,将'tab'替换为'spaces'并修复。
  • @JoséRosasSáenz 你的评论给我省了很多麻烦
  • 另外一个原因是缺少try 子句的except 部分。代码看起来是正确的(因为未缩进的行应该位于 try 块之外),但 Python 将其报告为“意外缩进”错误。这可以通过添加except 来解决,可能使用pass(如here
  • @dumbledad 您在哪个版本的 python 上看到它?当我尝试我的(2.7.15 和 3.6.8)时,我得到一个 SyntaxError
  • 我从网站复制/粘贴代码时遇到此错误。定位看起来不错,但我需要在 QGIS(3.10) 运行代码之前删除空白并使用空格重新应用。
【解决方案2】:

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

当您弄乱代码结构时会发生此错误,例如:

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

您的文件中也可能混合使用制表符和空格。

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

【讨论】:

  • 是的,一定要使用支持 python 的编辑器!我有一个问题,我在记事本++中使用默认设置进行编辑,它得到了错误的空白
  • 混合制表符和空格会引发“语法错误:缩进中制表符和空格的使用不一致”
  • 请注意,Python Netbeans 插件目前不会将现有代码中的制表符转换为空格。但是,它会在您编写新代码时执行此操作。
  • PyCharm 可以一致地转换它。它还将突出显示“故障”处的行。我使用引号是因为现在不是 1960 年代,我无法相信像 Python 这样出色的语言仍然存在这种脑死亡、浪费时间的缺陷。
  • 我在编写代码的过程中无意中切换了编辑器,它在新代码中填满了我的缩进。这种变化看起来并不明显,但解释器不会运行我的代码。这篇文章帮助我找到了问题。
【解决方案3】:

使用 -tt 选项运行您的代码,以了解您是否在不一致地使用制表符和空格。

【讨论】:

  • Python 解释器的实现是什么?什么版本?您能否添加对(官方)文档的引用。 (但没有“编辑:”、“更新:”或类似的 - 问题/答案应该看起来好像是今天写的。)
【解决方案4】:

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

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

【讨论】:

  • 你具体是怎么做的?我正在使用 Sublime。
  • @chibole 不确定这是否仍然相关,但打开您的 Sublime 首选项并将“draw_white_space”更改为“all”,将“tab_size”更改为 4(应该是默认值)和“translate_tabs_to_spaces”更改为 true
  • 在 VSCode 中你可以使用 "editor.renderWhitespace": "all"
【解决方案5】:

通过使用正确的缩进。 Python 可以识别空格,因此您需要遵循其块的缩进指南,否则会出现缩进错误。

【讨论】:

    【解决方案6】:

    运行以下命令来解决它:

    autopep8 -i <filename>.py
    

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

    【讨论】:

    • 很容易实现。每次都对我有用,这就是为什么我希望分享对某人有益:)
    【解决方案7】:

    如果您使用 Sublime Text 编写 Python 并遇到缩进错误,

    菜单查看缩进将缩进转换为空格

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

    【讨论】:

    • 哦……是 sublime 造成的吗?
    • 是的,我描述的问题是由 Sublime 引起的。也可能是其他编辑造成的。从本质上讲,这个问题与 Python 希望根据空格处理缩进与各种编辑器根据制表符对缩进进行编码有关。
    • 我在使用 notepad++ 时遇到了同样的问题。眼见为实,所以花了一些时间来破解它。我必须一次将光标移动一个字符才能确定编辑器已将一些空格转换为制表符
    【解决方案8】:

    似乎没有提到的一个问题是,由于与缩进无关的代码问题,可能会出现此错误。

    以下面的脚本为例:

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

    当问题当然是缺少except: 语句时,这将返回IndentationError: unexpected unindent

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

    【讨论】:

    • linter 会抓住它吗(例如,Pylint)?
    【解决方案9】:

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

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

    【讨论】:

      【解决方案10】:

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

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

      def my_function():
          x = 3
      
          y = 7
      

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

      【讨论】:

      • 关键是函数定义中的空行很好,但是它们仍然必须有初始空格,因为 Python 将任何空行解释为函数的结尾
      【解决方案11】:

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

      【讨论】:

        【解决方案12】:

        这取决于上下文。另一个尚未涵盖的场景如下。假设您有一个文件,其中包含一个包含特定方法的类

        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()
        

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

        预期的缩进块

        不希望出现缩进

        预期的表达方式

        在第一行

        意外的缩进

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

        【讨论】:

          【解决方案13】:

          有一个对我有用的技巧:

          如果您有意外的缩进,并且您看到所有代码都完美缩进,请尝试用另一个编辑器打开它,您会看到哪一行代码没有缩进。

          当我使用Vimgedit 或类似的编辑器时,我遇到了这种情况。

          尝试只为您的代码使用一个编辑器。

          【讨论】:

            【解决方案14】:

            只需复制您的脚本,并将其放在“””您的整个代码“””下...

            在变量中指定这一行...比如,

            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.
            

            【讨论】:

            • 我将如何运行我的代码。我是否必须删除“”和“””以及打印 a.replace 并正常运行?
            • no """ """(三引号)引用您的内容而不是字符串。它是必需的,因为您的代码可能包含单引号/双引号的字符串,因此需要 """。
            【解决方案15】:

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

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

            【讨论】:

              【解决方案16】:

              Notepad++ 给了 tab 空间正确,但缩进问题终于在Sublime Text 编辑器中找到了。

              使用 Sublime Text 编辑器并逐行进行。

              【讨论】:

                【解决方案17】:

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

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

                确保识别并删除这些空格,使用像 Notepad++ 这样的文本编辑器,或者手动从出现错误的代码行中删除空格。

                # 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]]
                

                【讨论】:

                  【解决方案18】:

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

                  您可以采取以下步骤来纠正此问题:

                  1. 复制导致错误的制表符或空格

                  2. 在您的 IDE 中进行查找和替换(通常是 Ctrl + H)。

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

                  如果您将代码从外部源复制并粘贴到 IDE 中,也会经常发生此错误,因为其他地方的格式可能与您的 IDE 定义的“良好”缩进不匹配。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-03-31
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-06-10
                    相关资源
                    最近更新 更多