Python: «Ошибка отступа: не соответствует ни одному внешнему уровню отступа» - PullRequest
24 голосов
/ 11 ноября 2009

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

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

55 голосов
/ 11 ноября 2009

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

python -m tabnanny <name of python file>
6 голосов
/ 11 ноября 2009

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

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

4 голосов
/ 10 июля 2010

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

2 голосов
/ 27 октября 2011

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

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

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

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

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

1 голос
/ 30 августа 2016

У меня была похожая проблема с IndentationError в PyCharm.

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

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

0 голосов
/ 22 сентября 2018

У меня была такая же проблема с PyCharm. Я подошел к меню кодов и выбрал переформатировать код. Проблема ушла.

0 голосов
/ 09 сентября 2016

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

def genericFunction(variable):

    for line in variable:

       line = variable


   if variable != None:
      return variable

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

0 голосов
/ 22 апреля 2016

IDLE для пользователей VISUAL STUDIO: Я также столкнулся с этой проблемой при перемещении кода непосредственно из IDLE в Visual Studio. При нажатии на вкладку IDLE добавляет 4 пробела вместо вкладки. В режиме IDLE нажмите Ctl + A, чтобы выделить весь код, и перейдите в «Формат»> «Регион табификации». Теперь переместите код в visual studio, и большинство ошибок должно быть исправлено. Время от времени появляется не входящий в код код, просто исправьте его вручную.

0 голосов
/ 04 марта 2013

У Geany есть опция в меню, которая гласит «Apply Default Intendation», которая заменяет вкладки на количество пробелов, если это указано в настройках Geany

0 голосов
/ 05 ноября 2010

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

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

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

Но реальная мысль, которую я хотел подчеркнуть, заключается в том, что: tabnanny НЕ НАСТОЯЩИМ: возможно, вы получаете ошибку 'indentation', когда на самом деле это просто синтаксическая ошибка.

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

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

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

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

...