【问题标题】:What should I do with "Unexpected indent" in Python?python中的“意外缩进”怎么办?
【发布时间】:2010-11-04 05:55:59
【问题描述】:

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

【问题讨论】:

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

标签: python indentation


【解决方案1】:

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

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

>>> 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/while/for语句,函数定义)。

>>> 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"

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

我建议你使用像 PyScripterNetbeans 这样的 Python 语法感知编辑器

【讨论】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

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

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

    【讨论】:

      【解决方案6】:

      如果你正在使用 Sublime 编写 Python 并遇到缩进错误,

      查看 -> 缩进 -> 将缩进转换为空格

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

      【讨论】:

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

      运行以下命令来解决它:

      autopep8 -i <filename>.py
      

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

      希望能解决

      【讨论】:

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

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

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

      【讨论】:

        【解决方案9】:

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

        以下面的脚本为例:

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

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

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

        【讨论】:

          【解决方案10】:

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

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

          def my_function():
              x = 3
          
              y = 7
          

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

          【讨论】:

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

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

          【讨论】:

            【解决方案12】:

            有一个对我有用的技巧:

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

            我在使用 vim、gedit 或类似的编辑器时遇到过这种情况。

            尽量只为您的代码使用 1 个编辑器。

            【讨论】:

              【解决方案13】:

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

              在变量中指定这一行.. 像,

              a = """ your python script """
              print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
              # here we replacing tab space by four char space as per pep 8 style guide..
              

              现在执行这段代码,在 Sublime 编辑器中使用 ctrl+b,现在它会在控制台打印缩进的代码。就是这样

              【讨论】:

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

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

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

              【讨论】:

                【解决方案15】:

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

                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 将解决所有这四个问题。

                【讨论】:

                  【解决方案16】:

                  Notepad++ 提供了正确的制表符空间,但缩进问题最终在 Sublime 文本编辑器中找到。

                  使用 Sublime 文本编辑器并逐行进行

                  【讨论】:

                    【解决方案17】:

                    缩进在 Python 中很重要,与许多其他编程语言不同,这并不是为了代码的可读性。 如果连续命令之间的代码中有任何空格或制表符,python 将给出此错误,因为 Python 对此很敏感。当我们将代码复制并粘贴到任何 Python 时,我们可能会收到此错误。 确保使用 Notepad++ 等文本编辑器识别并删除这些空格,或者手动从出现错误的代码行中删除空格。

                    Step1 :Gives error 
                    L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
                    print(L[2: ])
                    
                    Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])
                    
                    Step3: 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. 将复制的制表符或空格粘贴到“查找”搜索栏中,然后将它们全部替换为 4 个空格(假设您的 IDE 使用 4 个空格作为“好的”缩进)

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-10-25
                        • 2011-05-14
                        相关资源
                        最近更新 更多