2013-02-26 4 views
6

web.application nimmt eine nicht dokumentierte fvars Argument an dem die web.py tutorial gibt globals() etwa so:Was ist der Zweck der Übergabe von "globals()" als web.py fvars?

import web 

class index: 
    def GET(self): 
     return "Hello, world!" 

urls = (
    '/', 'index' 
) 

if __name__ == "__main__": 
    app = web.application(urls, globals()) 

Ich habe mindestens eine Anwendung gesehen, die locals() gibt. Wofür wird diese Variable verwendet und warum möchten Sie sie übergeben? locals() oder globals()?

Antwort

4

Es wird von application.handle() (die wiederum application._delegate() aufruft) verwendet, um die Handler-Klasse von einer Zeichenfolge in das Klassenobjekt selbst zu konvertieren. Source code here.

Zum Beispiel in Ihrem Code-Snippet oben ist urls = ('/', 'index') das URL-to-Class-String-Mapping. So web.application benötigt Ihr globals() dict um in der Lage zu sein, die Zeichenfolge 'index' nachzuschlagen und die Klasse selbst zu bekommen.

Ich denke eigentlich, dass dies ein etwas nicht pythonisches Design ist. Warum gehst du nicht einfach direkt in die Klasse? Ich denke, web.py unterstützt diesen Ansatz ebenfalls. Ich glaube jedoch, dass die Klassen als Strings erstellt wurden, so dass Autoreload einfacher ist. Der Autoreload-Code verwendet stark fvars.

Re locals(): auf der Modulebene macht locals() nicht wirklich Sinn, aber es gibt das gleiche Wörterbuch wie globals() zurück, weshalb das funktionieren würde.

+0

Das scheint eine vernünftige Erklärung zu sein. Das Nachschlagen scheint mir jedoch wirklich seltsam zu sein; Wenn Sie einen vollständig qualifizierten Klassennamen übergeben, warum würden Sie dann ein Wörterbuch weitergeben? Vielleicht unterstützt es beide Fälle (z. B. lokale Namen und ein Diktat ODER vollständig qualifizierte Namen und ein leeres Diktat). –

+0

@ AndréCaron, web.py muss in der Lage sein, den Klassennamen irgendwo nachzuschlagen, daher das globale Wörterbuch. Es kann den Klassennamen nicht in seinen eigenen Globals nachschlagen, es braucht Ihre App. –

+0

Sicher kann, es muss nur den Punktnamen wie andere Python-Frameworks auflösen. –