Python:“缩进错误:unindent与任何外部缩进级别都不匹配”

时间:2009-11-10 22:38:03

标签: python indentation

我无法弄清楚这有什么问题...

#!/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

16 个答案:

答案 0 :(得分:55)

您的文件中可能有混合标签和空格。您可以使用python帮助检查

中的此类错误
python -m tabnanny <name of python file>

答案 1 :(得分:6)

原始源文件中可能包含空格和制表符。用四个空格替换所有标签(反之亦然),您应该立即看到问题。

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

答案 2 :(得分:4)

不要忘记使用“”评论。这些也需要精确的缩进(我也可以解决这个该死的错误的1/2小时工作!)

答案 3 :(得分:2)

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

区分哪些线路有问题的好方法是: 编辑 2.偏好 编辑 4.检查“自动缩进” 5.将缩进增加到12或一些大数

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

使整个代码约定只是TAB或只是SPACE(必须逐行手动完成)

希望这会有所帮助......

答案 4 :(得分:1)

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

我在代码中找不到任何标签,但是一旦我在使用IndentationError的行之后删除了代码,一切都很顺利。

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

答案 5 :(得分:1)

遇到相同的问题,我将代码复制到了jupyter 它向我显示了正确的间距,我用更正后的间距替换了错误的间距,并且有效

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

最后,我将我的代码返回复制到vs代码

答案 6 :(得分:0)

也许就是这部分:

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

尝试遵循该编码风格。

答案 7 :(得分:0)

我建议您一直检查缩进级别。确保您一直使用任何一个标签或一直使用空格,没有混合。我过去曾经有过一些奇怪的压痕问题,这些问题都是混合造成的。

答案 8 :(得分:0)

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

正如有几位评论所说,你发布的代码包含几(5)个语法错误(两次=而不是==和三次':'缺失)。

一旦语法错误得到纠正,我就没有任何问题,无论是缩进还是其他问题;当然,不可能看到你有其他人建议的混合标签和空格,这可能是你的问题。

但我要强调的真正意义是: tabnanny不可行:当它实际上只是语法错误时,你可能会收到“缩进”错误。

EG。当我添加一个超过必要的闭括号时,我得到了它; - )

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

会引起tabnanny警告下一行。

希望这有帮助!

答案 9 :(得分:0)

Geany在其菜单中有一个选项,即“应用默认缩进”,如果在德国设置中指定,则用制表符号替换制表符

答案 10 :(得分:0)

对可视工作室用户的熟悉:我将代码直接从IDLE移动到Visual Studio时遇到了这个问题。当您按Tab键时,IDLE会添加4个空格而不是选项卡。在IDLE中,点击Ctl + A选择所有代码,然后转到格式&gt; Tabify Region。现在将代码移动到visual studio,大多数错误都应该修复。每隔一段时间就会出现一些非标签代码,只需手动修复即可。

答案 11 :(得分:0)

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

def genericFunction(variable):

    for line in variable:

       line = variable


   if variable != None:
      return variable

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

答案 12 :(得分:0)

我在PyCharm中也遇到了这个问题。我进入代码菜单并选择了重新格式化代码。问题消失了。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

我从博客复制的代码遇到了这个问题。我通过Shift + Tab'ing(取消缩进)最后一个抛出错误的代码块一直到最左侧来解决了PyCharm的问题,然后将其Tab's回到原来的位置。我想是间接地与上面的“重新格式化代码”注释相同。

答案 15 :(得分:0)

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