2012-09-21 18 views

Antwort

4

Sie können keine from __future__ import Anweisungen in Mako-Vorlagen verwenden. Überhaupt.

Dies liegt daran, eine Mako-Vorlage auf eine Python-Datei kompiliert wird, und damit diese es an der Arbeit setzt an der Spitze dieser Python-Datei einige ersten Strukturen auf:

# -*- encoding:ascii -*- 
from mako import runtime, filters, cache 
UNDEFINED = runtime.UNDEFINED 
__M_dict_builtin = dict 
__M_locals_builtin = locals 
_magic_number = 7 
_modified_time = 1348257499.1626351 
_template_filename = '/tmp/mako.txt' 
_template_uri = '/tmp/mako.txt' 
_source_encoding = 'ascii' 
_exports = [] 

Nur nach diesem Initial Setup ist jeder Code aus der Vorlage selbst enthalten. Ihre from __future__ import division wird nie zuerst platziert werden.

Sie können weiterhin verwenden Gleitkomma-Division durch entweder Operand des / Divisions-Operator mit einem Schwimmer Gießen:

>>> 1/2 
0 
>>> float(1)/2 
0.5 

Solange Sie diese Abhilfe folgen Sie können ohne die division Zukunft Import fein tun.

+0

Ja, ich sah dies aus dem Debugging (und das war der Fehler in Zeile 17), aber Mike Bayer (techspot.zzzeek.org) ist so schlau, ich dachte, er hätte eine Unterkunft dafür. Auch "Teilung" ist nicht der einzige zukünftige Import ("mit" kommt mir in den Sinn). Ich habe 'float()' benutzt, bevor ich das versuchte. – Hollister

+0

Sie müssten eine Feature-Anforderung einfügen, um 'from __future__ with'-Anweisungen an den Anfang der python-Ausgabe für die Vorlage zu verschieben. Da solche Importe aber auch das Template-Gerüst verändern könnten, bin ich mir nicht sicher, ob dies eine gute Idee wäre und von Mike Bayer oder den anderen Mako-Betreuern akzeptiert würde. –

0

von __future__ importieren wären ordentlich, aber ich kann nicht glauben, wie es (vielleicht jemanden, der mit Mako Interna kann besser vertraut ist) zu machen, arbeitet. Martijn erklärt, warum es nicht möglich ist. Ich kann jedoch ein paar Arbeiten vorschlagen.

Wenn möglich, machen Sie die Division außerhalb der Vorlage und setzen Sie das Ergebnis in den Kontext. Dies passt zu meiner persönlichen Präferenz, so viel Logik wie möglich aus der Vorlage herauszuhalten.

Wenn das keine Option ist, gibt es die Hacky-Lösung, wandeln Sie Ihre Operanden in Floats um. Wenn Sie diese Abteilung in einer Reihe von verschiedenen Orten tun müssen, können Sie eine Funktion in einem Modul-Ebene Block hinzufügen:

<%! 
    def div(a, b): 
     return float(a)/float(b) 
%> 

Definitiv weniger elegant als das, was Sie im Sinne hatten, aber es wird funktionieren.

+0

Die überwiegende Mehrheit meiner Logik ist in den Ansichten, aber dieser Fall ist eine Verarbeitung jeder Datenzeile direkt bevor es angezeigt wird, also dachte ich, ich würde den Code in der Nähe halten. Ich kann immer eine Hilfsfunktion schreiben und importieren, aber das wäre in der Tat ordentlich. – Hollister