python - online - indentationerror: unindent does not match any outer indentation level
Python: "Error de sangría: unindent no coincide con ningún nivel de sangría exterior" (12)
Es posible que haya pestañas y espacios mixtos en su archivo. Puede tener la ayuda de Python para verificar dichos errores con
python -m tabnanny <name of python file>
Simplemente no puedo entender qué está mal con esto ...
#!/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()
Me sale lo siguiente cada vez:
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
Estoy usando la versión gedit básica que viene con Ubuntu 11.10. Yo tenía el mismo error. Esto se debe principalmente cuando se mezclan espacios con pestañas.
Una buena manera de diferenciar qué líneas tienen problemas sería ir a: 1. editar 2. preferencias 3. editor 4. marcar "sangría automática" 5. aumentar la sangría a 12 o algún número grande
después de realizar el quinto paso, podrá ver las líneas de su código que están causando problemas (estas son las líneas que tienen una combinación de espacio y pestaña)
Haga la convención de código completa como solo TAB o SPACE (esto debe hacerse manualmente línea por línea)
Espero que esto ayude...
Geany tiene una opción en sus menús que dice ''Aplicar la intención predeterminada'' que reemplaza las pestañas por el número de espacios si se especifica en la configuración de Geany
Lo siento, no puedo agregar comentarios ya que mi reputación no es lo suficientemente alta: - /, así que esto tendrá que ser una respuesta.
Como varios han comentado, el código que ha publicado contiene varios (5) errores de sintaxis (dos veces = en lugar de == y faltan tres '':'').
Una vez que se corrigieron los errores de sintaxis, no tengo ningún problema, ya sea una sangría o no; por supuesto, es imposible ver si tiene pestañas y espacios combinados como lo ha sugerido otra persona, lo que probablemente sea su problema.
Pero el punto real que quería subrayar es que: tabnanny NO ES REALIZABLE: es posible que esté recibiendo un error de ''sangría'' cuando en realidad es solo un error de sintaxis.
P.ej. Lo obtuve cuando añadí un paréntesis cerrado más de lo necesario ;-)
i += [func(a, b, [c] if True else None))]
provocaría una advertencia de tabnanny para la siguiente línea.
¡Espero que esto ayude!
No olvide el uso de "" "comentarios. Estos también necesitan una sangría precisa (¡un trabajo de 1/2 hora para mí para resolver este maldito error también!)
Probablemente tenga una mezcla de espacios y pestañas en su archivo fuente original. Reemplace todas las pestañas con cuatro espacios (o viceversa) y debería ver el problema de inmediato.
Su código como pegado en su pregunta no tiene este problema, pero creo que su editor (o su navegador web, o el Desbordamiento de pila ...) podría haber hecho la conversión de pestañas a espacios sin su conocimiento.
Recomendaría revisar sus niveles de sangrado todo el tiempo. Asegúrese de que está utilizando las pestañas en todo el camino o los espacios en todo el camino, sin mezcla. He tenido problemas de sangrado impares en el pasado que han sido causados por una mezcla.
Tal vez sea esta parte:
if speed > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
if generation > self.buginfo["maxgen"] : self.buginfo["maxgen"] = generation
Intenta eliminar el espacio extra para que se vea alineado.
Edición: de pep8
Yes: x = 1 y = 2 long_variable = 3 No: x = 1 y = 2 long_variable = 3
Trate de seguir ese estilo de codificación.
También tuve este problema con PyCharm. Subí al menú de códigos y seleccioné el código de reformateo. El problema se fue.
Tuve este mismo problema y no tenía nada que ver con las pestañas. Este fue mi código de problema:
def genericFunction(variable):
for line in variable:
line = variable
if variable != None:
return variable
Tenga en cuenta que lo anterior for
está sangrado con más espacios que la línea que comienza con if
. Esto es malo. Todas tus sangrías deben ser consistentes. Así que supongo que podrías decir que tenía un espacio perdido y no una pestaña extraviada.
Tuve un problema similar con IndentationError en PyCharm.
No pude encontrar ninguna pestaña en mi código, pero una vez que eliminé el código DESPUÉS de la línea con el error de sangría, todo estaba bien.
Sospecho que tenía una pestaña en la siguiente línea: sex = sex if not sex == 2 else random.randint(0,1)
USUARIOS DE IDLE PARA VISUAL STUDIO: También me encontré con este problema al mover el código directamente de IDLE a Visual Studio. Al presionar la pestaña IDLE se agregan 4 espacios en lugar de una pestaña. En IDLE, presione Ctl + A para seleccionar todo el código y vaya a Formato> Tabular región. Ahora mueva el código a Visual Studio y la mayoría de los errores deberían solucionarse. De vez en cuando habrá un código que está fuera de la pestaña, solo hay que arreglarlo manualmente.