Vraag Python: "Inspringingsfout: unindent komt niet overeen met elk buitenste inspringniveau"


Ik kan gewoon niet achterhalen wat er mis is met dit ...

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

Ik krijg elke keer het volgende:

  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

19
2017-11-10 22:38


oorsprong


antwoorden:


Het is mogelijk dat u gemengde tabbladen en spaties in uw bestand hebt. U kunt met Python hulp controleren op dergelijke fouten met

python -m tabnanny <name of python file>

50
2017-11-10 22:40



Waarschijnlijk heb je een mix van spaties en tabs in je originele bronbestand. Vervang alle tabs door vier spaties (of andersom) en u zou het probleem meteen moeten zien.

Uw code zoals geplakt in uw vraag heeft dit probleem niet, maar ik vermoed dat uw editor (of uw webbrowser, of Stack Overflow zelf ...) de conversie van tabs naar spaces zonder uw medeweten zou hebben gedaan.


6
2017-11-10 22:41



Vergeet niet het gebruik van "" "reacties te gebruiken. Deze hebben ook een exacte inspring nodig (een 1/2 uur werk voor mij om deze verdomde fout ook op te lossen!)


3
2017-07-10 09:15



Ik gebruik de gedit-basisversie die bij Ubuntu 11.10 wordt geleverd. Ik had dezelfde fout. Dit wordt voornamelijk veroorzaakt wanneer u spaties met tabbladen mixt.

Een goede manier om te differentiëren naar welke lijnen een probleem is, is om naar: 1. bewerken 2. voorkeuren 3. editor 4. vink "automatische inspringen" aan 5. verhoog de inspringing naar 12 of een groot aantal

na het doen van de vijfde stap zult u de lijnen van uw code kunnen zien die stinkende waardoor problemen veroorzaken (dit zijn de lijnen die een mix van ruimte en tabblad hebben)

Maak de gehele codeconventie als alleen TAB of alleen SPACE (dit moet handmatig regel voor regel gedaan worden)

Ik hoop dat dit helpt...


2
2017-10-26 20:10



Ik had een soortgelijk probleem met IndentationError in PyCharm.

Ik kon geen tabbladen vinden in mijn code, maar nadat ik de code had verwijderd NA de regel met de IndentationError, was alles goed.

Ik vermoed dat je een tabblad hebt in de volgende regel: sex = sex if not sex == 2 else random.randint(0,1)


1
2017-08-30 04:52



Ik zou aanraden om je indrukniveaus helemaal te controleren. Zorg ervoor dat u beide tabbladen helemaal of spaties helemaal gebruikt, zonder mengsel. Ik heb in het verleden rare indentatieproblemen gehad die zijn veroorzaakt door een mengsel.


0
2017-11-10 22:48



Misschien is het dit deel:

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

Probeer de extra ruimte te verwijderen zodat deze er uitgelijnd uitziet.

Bewerken: vanaf pep8

  Yes:

      x = 1
      y = 2
      long_variable = 3

  No:

      x             = 1
      y             = 2
      long_variable = 3

Probeer die codeerstijl te volgen.


0
2017-11-10 22:46



Sorry, ik kan geen opmerkingen toevoegen omdat mijn reputatie niet hoog genoeg is: - /, dus dit zal een antwoord moeten zijn.

Zoals verschillende hebben opgemerkt, bevat de code die u hebt gepost meerdere (5) syntaxisfouten (tweemaal = in plaats van == en drie ':' ontbreekt).

Zodra de syntaxisfouten zijn gecorrigeerd, heb ik geen probleem, of het nu gaat om inspringen of anders; Natuurlijk is het onmogelijk om te zien of je gemengde tabbladen en spaties hebt zoals iemand anders heeft voorgesteld, wat waarschijnlijk jouw probleem is.

Maar het echte punt dat ik wilde benadrukken is dat: tabnanny IS NIET REALIABEL: u krijgt mogelijk een 'inspringingsfout' wanneer het eigenlijk maar een syntaxisfout is.

Bijv. Ik kreeg het toen ik één gesloten haakje meer dan nodig had toegevoegd ;-)

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

zou een waarschuwing van tabnanny voor de volgende lijn veroorzaken.

Ik hoop dat dit helpt!


0
2017-11-05 14:48



Geany heeft een optie in zijn menu's met de tekst 'Apply Default Intendation' die tabbladen vervangt door het aantal spaties indien opgegeven in de instellingen van Geany


0
2018-03-04 10:13



IDLE VOOR VISUAL STUDIO GEBRUIKERS: Ik ben ook tegen dit probleem aangelopen bij het rechtstreeks verplaatsen van code van IDLE naar Visual Studio. Wanneer u op het tabblad drukt, voegt IDLE 4 spaties toe in plaats van een tabblad. Druk in IDLE op Ctl + A om alle code te selecteren en ga naar Opmaak> Tabify-regio. Verplaats de code nu naar Visual Studio en de meeste fouten moeten worden verholpen. Om de zoveel tijd zal er code zijn die off-tab is, alleen handmatig repareren.


0
2018-04-22 02:22