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
Primitive Template Engine (live coding)
Nachtrag:
kann es sein (noch nicht in bottle getestet), dass das Problem in
steckt?
Test:
kann es sein (noch nicht in bottle getestet), dass das Problem in
Code: Alles auswählen
eval(self.co, args, globals())
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]
- 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
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
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