2012-09-21 13 views

risposta

4

Non è possibile utilizzare le istruzioni from __future__ import nei modelli Mako. Affatto.

Questo perché un modello di Mako viene compilato in un file python, e in modo che questo funzioni Esso definisce alcune strutture iniziali nella parte superiore di tale file python:

# -*- 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 = [] 

Solo dopo questo l'installazione iniziale è qualsiasi codice dal modello stesso incluso. Il tuo from __future__ import division non verrà mai inserito per primo.

è comunque possibile utilizzare la divisione in virgola mobile lanciando uno degli operandi dell'operatore / divisione ad un galleggiante:

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

Finché si segue questa soluzione si può fare bene anche senza il futuro di importazione division.

+0

Sì, l'ho visto dal debug (e che l'errore era sulla linea 17), ma Mike Bayer (techspot.zzzeek.org) è così intelligente, ho pensato che avesse un alloggio per questo. Inoltre, 'division' non è l'unica importazione futura (' with' viene in mente). Stavo usando 'float()' prima di provare questo. – Hollister

+0

Dovresti inserire una richiesta di funzione per avere le istruzioni 'from __future__ with' spostate all'inizio dell'output python per il modello. Ma dal momento che tali importazioni potrebbero alterare il modello di impalcatura che significa anche se stesso, non sono sicuro che sarebbe una buona idea e accettato da Mike Bayer o dagli altri manutentori di Mako. –

0

Importazione da __future__ sarebbe in ordine, ma non riesco a pensare a come farlo funzionare (forse qualcuno che è più familiarità con interni di Mako può). Martijn spiega perché non è possibile. Posso suggerire un paio di lavori però.

Se possibile, eseguire la divisione all'esterno del modello e inserire il risultato nel contesto. Questo è in linea con la mia preferenza personale per mantenere il più possibile la logica del modello.

Se questa non è un'opzione, c'è la soluzione hacky, converti i tuoi operandi in float. Se avete bisogno di fare questa divisione in un mucchio di luoghi diversi è possibile aggiungere una funzione in un blocco di livello di modulo:

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

Decisamente meno elegante di quello che aveva in mente, ma che funzionerà.

+0

La maggior parte della mia logica è nelle viste, ma in questo caso si tratta dell'elaborazione di ciascuna riga di dati appena prima che venga visualizzata, quindi ho pensato di mantenere il codice vicino al suo utilizzo. Posso sempre scrivere una funzione di aiuto e importarla, ma sarebbe davvero ordinata. – Hollister

Problemi correlati