Подтвердить что ты не робот

Python: "Ошибка отступов: unindent не соответствует внешнему уровню отступа"

Я просто не могу понять, что с этим не так...

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

Ответ 1

Возможно, у вас есть смешанные вкладки и пробелы в вашем файле. Вы можете иметь возможность проверки python для таких ошибок с помощью

python -m tabnanny <name of python file>

Ответ 2

Вероятно, у вас есть смесь пробелов и вкладок в исходном исходном файле. Замените все вкладки четырьмя пробелами (или наоборот), и вы сразу увидите проблему.

В вашем коде, вставленном в ваш вопрос, нет этой проблемы, но я думаю, что ваш редактор (или ваш веб-браузер, или сам переполнение стека...) мог бы сделать преобразование вкладок в пространство без вашего ведома.

Ответ 3

Не забывайте использовать комментарии "". Они нуждаются в точном отступе (для меня тоже требуется 1/2 часа работы!)

Ответ 4

Я использую базовую версию gedit, которая поставляется с Ubuntu 11.10. У меня была такая же ошибка. Это происходит главным образом при смешивании пробелов с вкладками.

Хороший способ отличить, к каким линиям будет проблема, - это перейти к: 1. изменить 2. предпочтения 3. редактор 4. отметьте "автоматический отступ" 5. увеличьте отступ до 12 или некоторое большое число

после выполнения пятого шага вы сможете увидеть строки вашего кода, которые могут вызвать проблемы (это строки, в которых есть пробел и вкладка)

Сделать все условное соглашение как только TAB или просто SPACE (это нужно делать вручную по строкам)

Надеюсь, что это поможет...

Ответ 5

Может быть, эта часть:

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

Попробуйте следовать этому стилю кодирования.

Ответ 6

Я бы рекомендовал проверять уровни отступов на всем протяжении. Убедитесь, что вы используете все вкладки полностью или полностью, без смешивания. В прошлом у меня были проблемы с четными отступами, которые были вызваны смесью.

Ответ 7

Извините, я не могу добавлять комментарии, так как моя репутация недостаточно высока: -/, поэтому это должен быть ответ.

Как уже отмечалось несколько человек, код, который вы опубликовали, содержит несколько (5) синтаксических ошибок (дважды = вместо == и три: отсутствует).

После исправления синтаксических ошибок у меня нет никаких проблем, будь то отступы или иначе; конечно, невозможно увидеть, были ли у вас смешанные вкладки и пробелы, как это предлагал кто-то другой, что, вероятно, является вашей проблемой.

Но реальная точка, которую я хотел подчеркнуть, заключается в следующем: tabnanny IS NOT REALIABLE: вы можете получить ошибку "отступа", если на самом деле это просто синтаксическая ошибка.

Eg. Я получил его, когда я добавил одну закрытую круглую скобку больше, чем необходимо; -)

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

вызовет предупреждение из tabnanny для следующей строки.

Надеюсь, это поможет!

Ответ 8

Geany имеет в своем меню опцию, в которой говорится: "Применить намерение по умолчанию", которое заменяет вкладки на количество пробелов, если указано в настройках Geany.

Ответ 9

ИДЕТ ДЛЯ ВИЗУАЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ СТУДИО: Я столкнулся с этой проблемой и при перемещении кода непосредственно из IDLE в Visual Studio. Когда вы нажимаете вкладку, IDLE добавляет 4 пробела вместо вкладки. В IDLE нажмите Ctl + A, чтобы выбрать весь код и перейдите в раздел Формат > Табизация. Теперь переместите код в визуальную студию, и большинство ошибок должно быть исправлено. Каждый так часто будет код, который находится вне поля вкладки, просто исправьте его вручную.

Ответ 10

У меня была аналогичная проблема с IndentationError в PyCharm.

Я не смог найти никаких вкладок в моем коде, но как только я удалил код ПОСЛЕ линии с IndentationError, все было хорошо.

Я подозреваю, что у вас есть вкладка в следующей строке: sex = sex if not sex == 2 else random.randint(0,1)

Ответ 11

У меня была такая же проблема, и она не имела ничего общего с вкладками. Это был мой проблемный код:

def genericFunction(variable):

    for line in variable:

       line = variable


   if variable != None:
      return variable

Обратите внимание, что выше for имеет отступы с большим количеством пробелов, чем строка, начинающаяся с if. Это плохо. Все ваши отступы должны быть последовательными. Поэтому, я думаю, вы могли бы сказать, что у меня было странное пространство, а не бродячая вкладка.