Python: “Indentation d'Erreur: unindent ne correspond pas à l'extérieur niveau d'indentation”
Je ne peux pas comprendre ce qui ne va pas avec cette...
#!/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()
Je reçois le texte suivant à 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
- Rien de visible à l'œil. Comme suggéré dans les réponses, sans doute une question mixte de tabulations et les espaces. Ou quelque chose des Dieux, mécontent de Vie des projets 😉
- ce n'est pas le code que vous êtes en cours d'exécution. vous n'avez pas
def new
sur la ligne 53 (il est sur la ligne 37), ce posté code produitSyntaxError
sur la ligne 54.
Vous devez vous connecter pour publier un commentaire.
Il est possible que vous avez mélangé les tabulations et des espaces dans votre fichier. Vous pouvez avoir python aider à vérifier pour les erreurs avec
Vous avez probablement un mélange d'espaces et de tabulations dans votre fichier source d'origine. Remplacer tous les onglets avec quatre espaces (ou vice versa) et vous devriez voir le problème tout de suite.
Votre code collé dans votre question n'a pas ce problème, mais je suppose que votre éditeur de texte (ou votre navigateur web, ou de Dépassement de la Pile elle-même...) aurait pu faire les onglets-à-espaces de conversion à votre insu.
N'oubliez pas l'utilisation de """ commentaires. Ces besoin précis de l'indentation trop (une 1/2 hr travail pour moi la résolution de ce putain d'erreur de trop!)
J'utilise gedit version de base qui vient avec Ubuntu 11.10.
J'ai eu le même message d'erreur.
Ceci est principalement causé lorsque vous mélangez des espaces avec des onglets.
Un bon moyen de se différencier que les lignes qui ont le problème serait d'aller à:
1. modifier
2. préférences
3. l'éditeur
4. cochez la case "automatique indentation"
5. augmenter l'indentation à 12 ou certains grand nombre
après la cinquième étape, vous serez en mesure de voir les lignes de code qui sont relly poser problème (ce sont les lignes qui ont un mélange de l'espace et tabulation)
Rendre l'ensemble du code convention seulement ONGLET ou juste de l'ESPACE (ce qui doit être fait manuellement, ligne par ligne)
Espère que cela aide...
J'ai eu un problème similaire avec IndentationError dans PyCharm.
Je ne pouvais pas trouver tous les onglets dans mon code, mais une fois que j'ai supprimé le code APRÈS la ligne avec le IndentationError, tout allait bien.
Je soupçonne que vous avez eu un onglet dans la ligne suivante:
sex = sex if not sex == 2 else random.randint(0,1)
Je voudrais vous conseillons de vérifier vos niveaux d'indentation tout le chemin à travers. Assurez-vous que vous utilisez les onglets de toutes les façon ou d'espaces tout le chemin, sans mélange. J'ai fait des petits indentation dans le passé des problèmes qui ont été causés par un mélange.
Peut-être de cette partie:
Essayez de supprimer l'espace supplémentaire pour le faire paraître alignés.
Edit: a partir de pep8
Essayer de suivre ce style de codage.
if i = x
, il devrait êtreif i == x
. Et vous avez manqué certains ":" à la fin de certains de la méthodeif i = x
n'importe où. Etif i = x
ne devrait même pas en Python! Le compilateur ne même pas vous laisser faire cela! @dex, ligne(s) parlez-vous?Désolé je ne peux pas ajouter des commentaires que ma réputation n'est pas assez élevé :-/, de sorte que cela va être une réponse.
Comme plusieurs ont dit, le code que vous avez posté contient plusieurs (5) les erreurs de syntaxe (deux fois = au lieu de == et trois ':' manquant).
Une fois les erreurs de syntaxe corrigé je n'ai pas de problème, il indentation ou d'autre; bien sûr, il est impossible de voir si vous avez mélangé les tabulations et des espaces que quelqu'un d'autre a suggéré, ce qui est probablement votre problème.
Mais le véritable point que je voulais souligner, c'est que:
tabnanny n'EST PAS FIABLE: vous avez peut-être un "indentation" erreur quand il est en fait juste une erreur de syntaxe.
Par exemple. Je l'ai eu quand j'avais ajouté un fermé de parenthèse de plus que nécessaire 😉
de provoquer l'affichage d'un avertissement de tabnanny pour la ligne suivante.
Espérons que cette aide!
Geany a une option dans les menus qui dit "s'Appliquent par Défaut Intendation", qui remplace les tabulations par le nombre de places si cela est spécifié dans Geany, les paramètres de
veille aux UTILISATEURS de VISUAL STUDIO: je suis tombé sur ce problème lors du déplacement de code directement à partir du RALENTI à Visual Studio. Lorsque vous appuyez sur l'onglet INACTIF ajoute 4 espaces au lieu d'un onglet. Au RALENTI, frapper ctrl+A pour sélectionner tout le code et allez à Format>Tabify Région. Déplacez maintenant le code pour visual studio et la plupart des erreurs à corriger. Chaque si souvent, il y aura un code qui est hors onglet, il suffit de le fixer manuellement.
J'ai eu ce même problème et il n'avait rien à voir avec les onglets. C'était mon problème de code:
Remarque ci-dessus
for
est en retrait avec plus d'espaces que la ligne qui commence avecif
. Ce qui est mauvais. Tous vos retraits doivent être cohérentes. Donc je suppose que vous pourriez dire que j'ai eu un parasite de l'espace et pas un errant onglet.J'ai eu ce problème avec PyCharm ainsi. Je suis allé jusqu'à le code de menu sélectionné et de reformater le code. Problème a disparu.