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
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>
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.
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!)
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...
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)
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.
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.
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.
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.
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.
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.
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!