2009-11-10 18 views
16

que no puedo averiguar lo que está mal con este ...Python: "La sangría de error: Unindent no coincide con ningún nivel de sangría externa"

#!/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 el siguiente cada vez que:

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 
+0

Nada aparente a la vista. Como se sugiere en las respuestas, probablemente sea una cuestión de pestañas/espacios mixtos. O algo de los dioses, descontento con los proyectos de ALife ;-) – mjv

+1

este no es el código que está ejecutando. usted no tiene 'def new' en la línea 53 (está en la línea 37), este código publicado produce' SyntaxError' en la línea 54. – SilentGhost

Respuesta

48

Es posible que haya mezclado pestañas y espacios en su archivo. Usted puede tener cheque pitón ayuda para este tipo de errores con

python -m tabnanny <name of python file> 
+0

Lo he intentado, tengo Bugs.py 31 'self.sex = [" Hombre "," Mujer "] \ n ' comprobado las pestañas/espaciado y parece estar bien – Rob

+3

@Rob: Si tiene un error, entonces" parece estar bien "es un juicio que podría ser incorrecto. Reemplaza todas las pestañas con espacios. –

+2

Nunca he oído hablar de tabnanny, buen consejo –

6

Es probable que tenga una mezcla de espacios y tabulaciones en su archivo fuente original. Reemplaza todas las pestañas con cuatro espacios (o viceversa) y deberías ver el problema enseguida.

Su código como pegado en su pregunta no tiene este problema, pero supongo que su editor (o su navegador web, o Desbordamiento de pila ...) podría haber hecho la conversión de tabulaciones a espacios sin su conocimiento .

+0

que fue extraño, finalmente fui y encontré un carácter de tabulación para buscar y reemplazar y encontré 4 pestañas arrojadas al azar en mi código. Gracias – Rob

+1

Y esta es solo una razón por la que creo que los espacios en blanco significativos son una mala idea. – Svante

+1

Creo que el problema es permitir tab = n espacios en el idioma. Estás peleando una batalla perdida si peleas con un espacio en blanco significativo, y hay una buena razón para eso. –

0

Tal vez sea esta parte:

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

tratar de eliminar el espacio adicional para que parezca alineado.

Editar: desde pep8

Yes: 

     x = 1 
     y = 2 
     long_variable = 3 

    No: 

     x    = 1 
     y    = 2 
     long_variable = 3 

trata de seguir su estilo de codificación.

+0

Además, tienes un montón de 'if i = x', debería ser' if i == x'. Y te perdiste un poco ":" al final de algún método –

+0

Lo sé, soy un poco descuidado y simplemente lo veo todo más tarde cuando pruebo :) – Rob

+0

Miré a través del código y no veo 'si i = x 'en cualquier lugar. Y 'if i = x' ¡ni siquiera debería funcionar en Python! ¡El compilador ni siquiera te dejará hacer eso! @dex, ¿de qué línea (s) estás hablando? – steveha

0

Recomendaría revisar sus niveles de sangría todo el tiempo. Asegúrate de estar usando las pestañas completamente o los espacios en todo el camino, sin mezcla. He tenido problemas de indentación en el pasado que han sido causados ​​por una mezcla.

2

no se olvide el uso de """ comentarios. Estos necesitan muesca precisa también (un trabajo de 1/2 hora para mí resolver este maldito error también!)

0

Lo siento, no puedo agregar comentarios como mi reputación no es lo suficientemente alta: - /, así que esto tendrá que ser una respuesta.

Como han comentado varios, el código que ha publicado contiene varios (5) errores de sintaxis (dos veces = en lugar de == y tres ' 'faltante')

Una vez corregidos los errores de sintaxis, no tengo ningún problema, ya sea una sangría o cualquier otra cosa, por supuesto es imposible ver si tiene pestañas y espacios mixtos como s alguien más ha sugerido, que probablemente sea su problema.

Pero el verdadero punto que quería subrayar es que: tabnanny NO ES REALISIBLE: es posible que aparezca un error de "sangría" cuando en realidad se trata de un error de sintaxis.

Por ejemplo. Lo tengo cuando me había añadido 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!

2

Estoy usando la versión básica de gedit que viene con Ubuntu 11.10. Tuve el mismo error. Esto se produce principalmente al mezclar espacios con pestañas.

Una buena manera de diferenciar en cuanto a qué líneas tienen problema sería ir a: 1. edición 2. preferencias 3. 4. editor de verificación "sangría automática" 5. aumento de la sangría a 12 o alguna gran número

después de hacer el quinto paso que será capaz de ver las líneas de código que están causando Relly problema (estas son las líneas que tienen una mezcla de espacio y tabulación)

Hacer el código completo convención como solo TAB o simplemente como ESPACIO (esto tiene que hacerse manualmente línea por línea)

Espero que esto ayude ...

+0

Sí, mi código solo funciona con TAB, pero no con SPACE. Realmente tiene sentido :) – Nezneika

0

Geany tiene una opción en sus menús que dice 'Aplicar Intendation Default' que sustituye a las pestañas por el número de espacios, si se especifica en la configuración de Geany

0

ocioso VISUAL STUDIO USERS: También encontré este problema al mover código directamente de IDLE a Visual Studio. Cuando presione tab IDLE agrega 4 espacios en lugar de una pestaña. En IDLE, presione Ctl + A para seleccionar todo el código y vaya a Formato> Región de tabulación. Ahora mueva el código a Visual Studio y la mayoría de los errores se deben corregir. De vez en cuando habrá un código que no está en la pestaña, simplemente soluciónalo manualmente.

0

Tuve un problema similar con IndentationError en PyCharm.

No pude encontrar ninguna pestaña en mi código, pero una vez que borré el código DESPUÉS de la línea con IndentationError, todo estaba bien.

sospecho que tenía una ficha en la línea siguiente: sex = sex if not sex == 2 else random.randint(0,1)

0

que tenía este mismo problema y no tenía nada que ver con pestañas. Esta fue mi código de problema:

def genericFunction(variable): 

    for line in variable: 

     line = variable 


    if variable != None: 
     return variable 

Nota lo anterior for se sangra con más espacios que la línea que comienza con if. Esto es malo. Todas sus sangrías deben ser consistentes. Así que supongo que podrías decir que tengo un espacio extraviado y no una ficha perdida.