2012-09-21 74 views
5

__future__导入使用我从Mako的模板

<%! 
    from __future__ import division 
%> 

在我的模板文件的最顶端。我得到的错误:

SyntaxError: from __future__ imports must occur at the beginning of the file 

什么是正确的方法来做到这一点?

回答

4

您不能在Mako模板中使用from __future__ import语句。完全一样。

这是因为Mako的模板编译python文件,并且为了这个工作,它设置了一些初步的结构在那个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 = [] 

只有此之后初始设置是包含模板本身的任何代码。你的from __future__ import division永远不会放在第一位。

你仍然可以使用浮点除以铸造/除法运算的一个操作数为float:

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

只要你遵循的解决方法,你可以做精而不division未来进口。

+0

是的,我从调试中看到了这一点(并且错误在第17行),但是Mike Bayer(techspot.zzzeek.org)非常聪明,我认为他有一个适应的空间。另外,'division'不是唯一的未来进口(想到“带'')。在我尝试这个之前,我正在使用'float()'。 – Hollister

+0

你不得不放入一个功能请求,将'from __future__ with'语句移动到模板的python输出的顶部。但是由于这种进口可能会改变模板脚手架本身的意义,我不确定这是否是一个好主意,并且被迈克拜耳或其他Mako维护人员所接受。 –

0

__future__导入将是整洁,但我想不出如何使其工作(也许有人谁更熟悉Mako的内部可以)Martijn解释了为什么它不可能。但我可以提出一些解决方法。

如果可能,请在模板之外进行划分,并将结果放入上下文中。这与我个人的偏好保持一致,尽可能多地保留模板。

如果这不是一个选项有hacky解决方案,将您的操作数转换为浮点数。如果你需要做的这个部门在很多不同的地方,你可以在模块级块添加一个功能:

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

绝对比你脑子里想的是什么不太优雅,但它会工作。

+0

我的绝大多数逻辑都在视图中,但这种情况是在显示每个数据行之前进行的一些处理,所以我认为我会保持代码接近它的使用。我总是可以编写一个辅助函数并导入它,但这确实会很整齐。 – Hollister