2010-06-03 17 views
6

Debo estar haciendo algo estúpido. Me estoy quedando esto en Google App Engine:Python: NameError: 'self' no está definido

class MainHandler(webapp.RequestHandler): 

    def render(self, template_name, template_data): 
     path = os.path.join(os.path.dirname(__file__), 'static/templates/%s.html' % template_name) 
     self.response.out.write(template.render(path, template_data)) # error here 

    def get(self): 
     self.response.out.write("hi") 

def main(): 
    application = webapp.WSGIApplication([('/', MainHandler)], 
             debug=True) 
    util.run_wsgi_app(application) 


if __name__ == '__main__': 
    main() 

Esto da un error:

Traceback (most recent call last): 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3192, in _HandleRequest 
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3135, in _Dispatch 
    base_env_dict=env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 516, in Dispatch 
    base_env_dict=base_env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2394, in Dispatch 
    self._module_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2304, in ExecuteCGI 
    reset_modules = exec_script(handler_path, cgi_path, hook) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2200, in ExecuteOrImportScript 
    exec module_code in script_module.__dict__ 
    File "main.py", line 22, in <module> 
    class MainHandler(webapp.RequestHandler): 
    File "main.py", line 38, in MainHandler 
    self.writeOut(template.render(path, template_data)) 
NameError: name 'self' is not defined 

¿Qué estoy haciendo mal?

+3

¿Seguro de ese fragmento de código proporcionado corresponde a la traza de la pila? Al menos veo una diferencia en err-line. – nkrkv

Respuesta

20

La excepción se produce mientras se está definiendo la clase, lo que significa que su sangría está desactivada. Las pestañas en Python son equivalentes a 8 espacios, por lo que si todas las líneas anteriores usan pestañas y su tabstop está configurada en 4 espacios, entonces la sangría solo se ve como correcta.

+0

8 espacios es una indignación. Debe ser 5. – detly

+3

@detly Una pestaña debe tener 0 espacios. Entonces no puedes verlos, y por lo tanto no pueden lastimar, ¿verdad? :-) – extraneon

1

La mayoría de las guías de estilo para python, incluido el google style guide, recomiendan utilizar espacios en lugar de pestañas ... la mayoría de los editores de texto también lo admiten. Te ayuda a evitar errores como este.

+0

También puede usar el script 'pep8' o ejecutar Python con la opción' -tt' para encontrar dichos errores. – Philipp

Cuestiones relacionadas