web-dev-qa-db-fra.com

Python: "Erreur d'indentation: unindent ne correspond à aucun niveau d'indentation externe"

Je n'arrive pas à comprendre ce qui ne va pas avec ça ...

#!/usr/bin/env python
#
#       Bugs.py
#       

from __future__ import division

# No Module!
if __!= '__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()

Je reçois ce qui suit à chaque fois:

  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
22
Rob

Il est possible que vous ayez mélangé des onglets et des espaces dans votre fichier. Vous pouvez avoir l'aide de python pour vérifier de telles erreurs avec

python -m tabnanny <name of python file>
55
mbarnett

Vous avez probablement un mélange d'espaces et de tabulations dans votre fichier source d'origine. Remplacez tous les onglets par quatre espaces (ou l'inverse) et vous devriez voir le problème tout de suite.

Votre code collé dans votre question ne pose pas ce problème, mais j'imagine que votre éditeur (ou votre navigateur Web, ou Stack Overflow lui-même ...) aurait pu effectuer la conversion tabs-à-espaces à votre insu.

6
RichieHindle

N'oubliez pas l'utilisation de "" "commentaires. Ceux-ci nécessitent également une indentation précise (un travail d'une demi-heure me permet également de résoudre cette fichue erreur!)

4
Pete

J'utilise la version de base de gedit fournie avec Ubuntu 11.10 . J'ai eu la même erreur . Cela est principalement dû au mélange d'espaces et de tabulations.

Un bon moyen de différencier les lignes qui posent problème est d'aller à: 1. modifier 2. préférences 3. éditeur 4. cochez "l'indentation automatique" 5. augmenter l'indentation à 12 ou un grand nombre

après la cinquième étape, vous pourrez voir les lignes de votre code qui posent problème (ce sont les lignes qui combinent espace et tabulation)

Faites en sorte que la convention de code dans son intégralité soit simplement TAB ou SPACE (ceci doit être fait manuellement ligne par ligne)

J'espère que cela t'aides...

2
jomyfrancis19

J'ai eu un problème similaire avec IndentationError dans PyCharm.

Je n'ai trouvé aucun onglet dans mon code, mais une fois que j'ai supprimé le code APRÈS la ligne avec IndentationError, tout allait bien.

Je soupçonne que vous aviez un onglet à la ligne suivante: sex = sex if not sex == 2 else random.randint(0,1)

1
IvanD

REPOSER LES UTILISATEURS DE STUDIO VISUELS: J'ai rencontré ce problème également lors du déplacement de code directement de IDLE vers Visual Studio. Lorsque vous appuyez sur l'onglet, IDLE ajoute 4 espaces au lieu d'un onglet. Dans IDLE, appuyez sur Ctrl + A pour sélectionner tout le code et aller à Format> Région de tabulation. Déplacez maintenant le code dans Visual Studio et la plupart des erreurs devraient être corrigées. De temps en temps, il y aura du code hors-onglet, corrigez-le simplement manuellement.

0
Wlliam

J'ai eu le même problème et cela n'avait rien à voir avec les onglets. C'était mon code de problème:

def genericFunction(variable):

    for line in variable:

       line = variable


   if variable != None:
      return variable

Notez que for ci-dessus est en retrait avec plus d'espaces que la ligne commençant par if. C'est mauvais. Tous vos retraits doivent être cohérents. Donc, je suppose que vous pourriez dire que j'avais un espace perdu et non un onglet errant.

0
Jared

Geany a une option dans ses menus qui dit "Appliquer l'indentation par défaut" qui remplace les tabulations par le nombre d'espaces si spécifié dans les paramètres de l'Allemagne.

0
oneindelijk

Peut-être que c'est cette partie:

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

Essayez de supprimer l’espace supplémentaire pour le faire paraître aligné.

Edit: de pep8

  Yes:

      x = 1
      y = 2
      long_variable = 3

  No:

      x             = 1
      y             = 2
      long_variable = 3

Essayez de suivre ce style de codage.

0
Loïc Wolff

Je recommanderais de vérifier vos niveaux d'indentation tout au long. Assurez-vous que vous utilisez soit des onglets à fond, soit des espaces à fond, sans mélange. J'ai eu des problèmes d'indentation étranges dans le passé qui ont été causés par un mélange.

0
Wayne Koorts

J'ai également eu ce problème avec PyCharm. Je suis allé au menu de code et choisi le code de reformatage. Le problème est parti.

0
Riv

Désolé, je ne peux pas ajouter de commentaires car ma réputation n'est pas assez élevée: - /, ce sera donc une réponse.

Comme plusieurs l'ont commenté, le code que vous avez posté contient plusieurs (5) erreurs de syntaxe (deux fois = au lieu de == et trois ':' manquants).

Une fois les erreurs de syntaxe corrigées, je n’ai plus aucun problème, qu’il s’agisse d’indentation ou autre; Bien sûr, il est impossible de voir si vous avez des tabulations et des espaces mélangés, comme quelqu'un l’a suggéré, ce qui est probablement votre problème. 

Mais ce que je voulais souligner, c’est que: Tabnanny IS NOT REALIABLE: vous risquez de recevoir une erreur "indentation" alors qu’il s’agit simplement d’une erreur de syntaxe.

Par exemple. Je l'ai eu quand j'avais ajouté une parenthèse fermée plus que nécessaire ;-)

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

provoquerait un avertissement de tabnanny pour la ligne suivante.

J'espère que cela t'aides!

0
Stefano