5

我有

<%!
    from __future__ import division
%>

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

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

这样做的正确方法是什么?

4

2 回答 2

4

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

这是因为 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永远不会被放在第一位。

您仍然可以通过将/除法运算符的任一操作数转换为浮点数来使用浮点除法:

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

只要您遵循该解决方法,您就可以在没有division未来导入的情况下做得很好。

于 2012-09-21T20:03:28.107 回答
0

从导入__future__会很整洁,但我想不出如何让它工作(也许对 Mako 内部更熟悉的人可以). Martijn解释了为什么这是不可能的。不过,我可以建议一些解决方法。

如果可能,请在模板之外进行除法并将结果放入上下文中。这符合我个人的偏好,即尽可能多地保留模板之外的逻辑。

如果这不是一个选项,那么可以使用 hacky 解决方案,将您的操作数转换为浮点数。如果您需要在一堆不同的地方进行这种划分,您可以在模块级块中添加一个函数:

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

绝对没有你想象的那么优雅,但它会起作用。

于 2012-09-21T20:12:07.080 回答