【问题标题】:Python: "Indentation Error: unindent does not match any outer indentation level"Python:“缩进错误:unindent 不匹配任何外部缩进级别”
【发布时间】:2010-12-15 06:26:03
【问题描述】:

我就是想不通这是怎么回事……

#!/usr/bin/env python
#
#       Bugs.py
#       

from __future__ import division

# No Module!
if __name__ != '__main__': 
    print "Bugs.py is not meant to be a module"
    exit()

# App
import pygame, sys, random, math
pygame.init()

# Configuration Vars
conf = {
    "start_energy": 50, 
    "food_energy": 25, 
    "mate_minenergy": 50, 
    "mate_useenergy": 35, 
    "lifespan": 300000
}

class Bugs:
    def __init__(self):
        self.list  = []
        self.timers= {}
        # Names / colors for sexes
        self.sex = ["Male", "Female"]
        self.color = ["#CBCB25", "#A52A2A"]
        # Bug info tracking
        self.bugid = 0
        self.buginfo = {"maxgen":0, "maxspeed":0}

    def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
        sex   = sex   if not sex   == 2 else random.randint(0,1)
        speed = speed if not speed == 0 else random.randint(1,3)
        # Create new bug object
        self.bugs.append(BugObj(sex, speed, generation, bugid, pygame.time.get_ticks, genes))
        # Make sure it has a timer
        if not self.timers[speed]:
            self.timers[speed] = 1
            pygame.time.set_timer(25 + speed, 1000 / speed)
        # Update info tracking variables
        if speed      > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
        if generation > self.buginfo["maxgen"]  : self.buginfo["maxgen"]   = generation
        self.bugid += 1

    def speed_count(self, speed):
        a = 0
        for i in list[:]:
            if i.speed = speed:
                a += 1
        return a

class BugObj:
    def __init__(self, sex, speed, generation, bugid, born, genes):
        global conf
        self.sex        = sex
        self.speed      = speed
        self.generation = generation
        self.id         = bugid
        self.born       = born
        self.genes      = genes
        self.died       = -1
        self.energy     = conf["start_energy"]
        self.target     = "None"

    def update(self):
        global conf
        if self.age() > conf["lifespan"]:
            self.die()
        else:
            f = closest_food()
            m = closest_mate()
            # If there's a potential mate
            if m != 0 and self.energy > conf["mate_minenergy"]:
                if not self.rect.colliderect(m.rect):
                    self.move_toward(m)
                    self.target = "Mate: " + str(m.rect.center)
                else:
                    Bugs.mate(self, m)
                    self.target = "Mate: (Reached)"
            elif f != 0:
                if not self.rect.colliderect(f.rect):
                    self.move_toward(f)
                    self.target = "Food: " + str(f.rect.center)
                else:
                    self.eat(f)
                    self.target = "Food: (Reached)"
            else:
                self.target = "Resting"
            # Use energy
            self.energy -= 0

    def closest_food(self):
        pass

    def closest_mate(self):
        pass

    def age(self):
        if self.died != -1:
            return pygame.time.get_ticks - self.born
        else:
            return self.died - self.born

    def die(self):
        # Remove self from the list
        Bugs.list.remove(self)
        # Turn off timer
        if not Bugs.speed_count(self.speed):
            Bugs.timers[self.speed] = 0
            pygame.time.timers(25 + self.speed, 0)
        # Bye!
        del self

class Food:
    def __init__(self)
        pass

    def update(self)
        pass

# Update Loop
while 1:
    ev = pygame.event.wait()
    speed = ev.type - 25
    if speed > 24:
        for i in Bugs.list[:]:
            if i.speed = speed
                i.update()
                print "Updating bug #" + str(i.id)
    if speed == 0:
        Food.update()

我每次都得到以下信息:

  File "Bugs.py" line 53
    def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
                                                                           ^
Indentation Error: unindent does not match any outer indentation level

【问题讨论】:

  • 肉眼看不到任何东西。正如回复中所建议的,可能是混合制表符/空格的问题。或者来自众神的东西,对 ALife 项目不满意 ;-)
  • 这不是您正在运行的代码。你在第 53 行没有 def new(它在第 37 行),这个发布的代码在第 54 行生成 SyntaxError
  • 您可以尝试在notepad++中查看文件并显示所有字符。如果它们都用于缩进,您将能够看到制表符和空格。

标签: python indentation


【解决方案1】:

您的文件中可能混合了制表符和空格。您可以让 python 帮助检查此类错误

python -m tabnanny <name of python file>

【讨论】:

  • 我试过了,得到了 Bugs.py 31 ' self.sex = ["Male", "Female"]\n' 检查了制表符/间距,似乎没问题
  • @Rob:如果你得到一个错误,那么“似乎没问题”是一个可能不正确的判断。用空格替换所有制表符。
  • @S.Lott - “看起来不错”我的意思是我这样做了大约 4 次,然后在 tabnanny 给我的任何行上发帖。它从未返回任何实际存在问题的行。
  • 对python初学者很有帮助
【解决方案2】:

PyCharm 也有这个问题。我去了代码菜单并选择了重新格式化代码。问题消失了。

【讨论】:

  • 就这么简单:-D...谢谢
【解决方案3】:

不要忘记使用 """ cmets。这些也需要精确的缩进(我也需要 1/2 小时才能解决这个该死的错误!)

【讨论】:

    【解决方案4】:

    您的原始源文件中可能混合有空格和制表符。将所有制表符替换为四个空格(反之亦然),您应该会立即看到问题。

    您粘贴到问题中的代码没有这个问题,但我猜您的编辑器(或您的网络浏览器,或 Stack Overflow 本身......)可能在您不知情的情况下完成了制表符到空格的转换。

    【讨论】:

    • 这很奇怪,我终于找到了一个制表符来放入查找和替换,它发现在我的代码中随机抛出了 4 个制表符。谢谢
    • 这只是我认为重要的空白是一个非常糟糕的主意的原因之一。
    • 我认为问题在于语言中允许 tab=n 空格。如果您与大量空白作斗争,那么您就是在打一场失败的战斗,这是有充分理由的。
    【解决方案5】:

    如果您是 VSCode 用户,那么您可能选中了 Insert Spaces 选项。这将用空格替换您按的每个选项卡,从而导致此问题。取消选中它,您就可以开始了。

    【讨论】:

      【解决方案6】:

      我正在使用 Ubuntu 11.10 附带的 gedit 基本版本。 我有同样的错误。 这主要是在您将空格与制表符混合时引起的。

      区分哪些线路有问题的好方法是转到: 1. 编辑 2.偏好 3. 编辑 4.勾选“自动缩进” 5. 将缩进增加到 12 或更大的数字

      完成第五步后,您将能够看到导致问题的代码行(这些行混合了空格和制表符)

      将整个代码约定设为 TAB 或 SPACE(这必须逐行手动完成)

      希望这会有所帮助...

      【讨论】:

      • 是的,我的代码仅适用于 TAB,但不适用于 SPACE。真的很有意义:)
      【解决方案7】:

      我将代码复制到 jupyter 时遇到了同样的问题 它向我展示了正确的间距,我用正确的间距替换了错误的间距,它可以工作

      我实际上复制了正确的行然后修改了我的文本

      最后我将我的代码复制到 vs 代码

      【讨论】:

        【解决方案8】:

        IDLE 到 VISUAL STUDIO 用户:我在将代码直接从 IDLE 移动到 Visual Studio 时也遇到了这个问题。当您按下制表符时,IDLE 会添加 4 个空格而不是制表符。在 IDLE 中,按 Ctl+A 选择所有代码,然后转到 Format>Tabify Region。现在将代码移动到 Visual Studio,大多数错误都应该得到修复。每隔一段时间就会有代码脱离标签,只需手动修复即可。

        【讨论】:

          【解决方案9】:

          我在 PyCharm 中遇到了类似的 IndentationError 问题。

          我在我的代码中找不到任何选项卡,但是一旦我在出现 IndentationError 的行之后删除了代码,一切都很好。

          我怀疑您在以下行中有一个标签: sex = sex if not sex == 2 else random.randint(0,1)

          【讨论】:

            【解决方案10】:

            我从博客中复制的代码遇到了这个问题。我通过 Shift+Tab'ing(unindenting) 最后一个错误抛出的代码块一直到左边,然后 Tab'ing 回到原来的位置,从而解决了 PyCharm 上的问题。我想在某种程度上间接地与上面的“重新格式化代码”注释相同。

            【讨论】:

              【解决方案11】:

              我建议您始终检查缩进级别。确保您一直使用制表符或一直使用空格,没有混合。过去我遇到过由混合物引起的奇怪的压痕问题。

              【讨论】:

                【解决方案12】:

                也许是这个部分:

                if speed      > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
                if generation > self.buginfo["maxgen"]  : self.buginfo["maxgen"]   = generation
                

                尝试删除多余的空间以使其看起来对齐。

                编辑:来自pep8

                  Yes:
                
                      x = 1
                      y = 2
                      long_variable = 3
                
                  No:
                
                      x             = 1
                      y             = 2
                      long_variable = 3
                

                尝试遵循这种编码风格。

                【讨论】:

                • 另外,你有很多if i = x,应该是if i == x。你在某些方法的末尾错过了一些“:”
                • 我知道,我有点马虎,等我测试的时候才发现:)
                • 我查看了代码,但在任何地方都没有看到if i = x。而if i = x 甚至不应该在 Python 中工作!编译器甚至不会让你这样做! @dex,你在说哪一行?
                【解决方案13】:

                抱歉,由于我的声誉不够高,我无法添加 cmets :-/,所以这必须是一个答案。

                正如一些人评论的那样,您发布的代码包含几 (5) 个语法错误(两次 = 而不是 == 并且缺少三个 ':')。

                一旦语法错误得到纠正,我就没有任何问题,无论是缩进还是其他;当然,不可能像其他人建议的那样查看您是否混合了制表符和空格,这可能是您的问题。

                但我想强调的真正要点是: tabnanny 不真实:当它实际上只是一个语法错误时,您可能会收到一个“缩进”错误。

                例如。当我添加了一个不必要的右括号时,我得到了它;-)

                i += [func(a, b, [c] if True else None))]
                

                会引起 tabnanny 下一行的警告。

                希望这会有所帮助!

                【讨论】:

                  【解决方案14】:

                  Geany 在其菜单中有一个选项,上面写着“应用默认意图”,如果在 Geany 的设置中指定,它会用空格数替换制表符

                  【讨论】:

                    【解决方案15】:

                    我有同样的问题,它与标签无关。这是我的问题代码:

                    def genericFunction(variable):
                    
                        for line in variable:
                    
                           line = variable
                    
                    
                       if variable != None:
                          return variable
                    

                    请注意,上面的for 缩进的空格比以if 开头的行要多。这是不好的。您的所有缩进必须一致。所以我想你可以说我有一个杂散空间而不是杂散标签。

                    【讨论】:

                      【解决方案16】:

                      我有这个问题。这是因为我的代码中有错误的空间。可能是下一行。删除所有空格和制表符并使用空格。

                      【讨论】:

                        猜你喜欢
                        • 2017-08-12
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-08-05
                        • 2010-10-04
                        相关资源
                        最近更新 更多