首页 文章

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

提问于
浏览
22

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

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

12 回答

  • 2

    您的文件中可能有混合标签和空格 . 你可以让python帮助检查这些错误

    python -m tabnanny <name of python file>
    
  • 0

    您的原始源文件中可能包含空格和制表符的混合 . 用四个空格替换所有选项卡(反之亦然),您应该立即看到问题 .

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

  • 0

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

  • 55

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

    区分哪些行有问题的好方法是:1 . 编辑2.首选项3.编辑器4.检查“自动缩进”5.将缩进增加到12或一些大数字

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

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

    希望这可以帮助...

  • 0

    我在PyCharm中遇到类似的问题 .

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

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

  • 6

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

  • 0

    也许是这部分:

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

    尝试删除额外的空间,使其看起来对齐 .

    编辑:从pep8

    是的:

    x = 1
    y = 2
    long_variable = 3

    没有:

    x = 1
    y = 2
    long_variable = 3

    尝试遵循这种编码风格 .

  • 4

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

    正如一些人所评论的那样,你发布的代码包含几(5)个语法错误(两次=而不是==和三次':'缺失) .

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

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

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

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

    会引起tabnanny对下一行的警告 .

    希望这可以帮助!

  • 0

    Geany在其菜单中有一个选项,显示“Apply Default Intendation”,如果在Geany的设置中指定,它会用空格数替换制表符

  • 0

    IDLE TO VISUAL STUDIO USERS: 在将代码直接从IDLE移动到Visual Studio时,我也遇到了这个问题 . 当您按Tab键时,IDLE会添加4个空格而不是选项卡 . 在IDLE中,点击Ctl A选择所有代码,然后转到格式>表格区域 . 现在将代码移动到visual studio,大多数错误都应该修复 . 每隔一段时间就会出现一些off-tab的代码,只需手动修复即可 .

  • 1

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

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

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

  • 0

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

相关问题