Primitive Template Engine (live coding)

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo Defnull,

danke für die Idee mit der globalen Variablen.

Ich habe mir auch den erzeugten Code angeschaut, der direkt ausgeführt ja auch wunderbar funktioniert. Auf die Idee, dass eval() Eigenheiten, was die Namensräume angeht besitzt, bin ich gar nicht gekommen.

Grüße,
Olaf
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Nachtrag:

kann es sein (noch nicht in bottle getestet), dass das Problem in

Code: Alles auswählen

eval(self.co, args, globals())
steckt?

Test:

Code: Alles auswählen

>>> s = """items = range(20)
div = 3
found = filter(lambda i: i % div == 0, items)
print found"""
>>> c = compile(s, '<template>', 'exec')
>>> eval(c)
[0, 3, 6, 9, 12, 15, 18]
>>> eval(c, {}, globals()) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<template>", line 3, in <module>
  File "<template>", line 3, in <lambda>
NameError: global name 'div' is not defined
>>> eval(c, locals(), globals())
[0, 3, 6, 9, 12, 15, 18]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Du hast recht, ich hab da wohl was mit den globalen und lokalen Namensräumen durcheinander geworfen. Mit der aktuellen github-Version klappt es auch ohne den Workaround wie erwartet.

Code: Alles auswählen

marc@nava:~/work/bottle$ git diff HEAD^^
diff --git a/bottle.py b/bottle.py
index 557c455..d58646f 100644
--- a/bottle.py
+++ b/bottle.py
@@ -659,7 +659,7 @@ class SimpleTemplate(BaseTemplate):
         ''' Returns the rendered template using keyword arguments as local vari
         args['stdout'] = []
         args['_subtemplates'] = self.subtemplates
-        eval(self.co, args, globals())
+        exec self.co in args
         return ''.join(args['stdout'])
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

OK Devnull,

Du warst schneller ;-).

Ich habe mit verschiedenen Varianten von eval() und exec herumgespielt, aber exec … in kannte ich noch nicht.

Danke für das schnelle Fixen.

Grüße,
Olaf
Antworten