2010-06-03 6 views
6

Ich muss etwas Dummes tun. Ich bin mit diesem in Google App Engine:Python: NameError: 'self' ist nicht definiert

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() 

Dies gibt einen Fehler:

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 

Was mache ich falsch?

+3

Sind Sie sicher, dass Code-Schnipsel auf den Stack-Trace versehen entspricht? Zumindest sehe ich einen Unterschied in der Fehlerzeile. – nkrkv

Antwort

20

Die Ausnahme tritt auf, während die Klasse definiert wird, was bedeutet, dass Ihre Einrückung deaktiviert ist. Registerkarten in Python entsprechen 8 Leerzeichen. Wenn also alle vorherigen Zeilen Registerkarten verwenden und Ihr Tabstop auf 4 Leerzeichen gesetzt ist, dann sieht die Einrückung nur korrekt aus.

+0

8 Räume ist eine Empörung. Es sollte 5 sein. – detly

+3

@detly Ein Tab sollte 0 Leerzeichen sein. Dann kannst du sie nicht sehen und somit können sie nicht verletzen, richtig? :-) – extraneon

1

Die meisten Styleguides für Python, einschließlich der google style guide, empfehlen die Verwendung von Leerzeichen anstelle von Tabs ... die meisten Texteditoren unterstützen dies auch. Hilft Ihnen, Fehler wie diese zu vermeiden.

+0

Sie können auch das Skript 'pep8' verwenden oder Python mit der Option' -tt' ausführen, um solche Fehler zu finden. – Philipp

3

Nur für den Fall, dass jemand darauf stößt und nach einer Lösung sucht, die nicht mit der Einrückung zu tun hat, ist dies eine gute Referenz für die Verwendung von self.

NameError: name 'self' is not defined