在Mako模板中使用`from __future__ import`

5

我有

<%!
    from __future__ import division
%>

在我的模板文件的顶部,我遇到了这个错误:

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

这应该怎么做才是正确的呢?

2个回答

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

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

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

只要你遵循这种解决方法,就不需要使用“division”未来导入。

是的,我通过调试看到了这个错误(错误在第17行),但是Mike Bayer(techspot.zzzeek.org)非常聪明,我认为他已经对此做了适应。此外,“division”并不是唯一的“future import”(例如“with”)。在尝试这个方法之前,我使用的是“float()”。 - Hollister
您需要提交一个功能请求,以便将 from __future__ with 语句移动到模板的 Python 输出顶部。但是,由于这样的导入可能会改变模板脚手架本身的含义,因此我不确定 Mike Bayer 或其他 Mako 维护者是否会接受这个想法。 - Martijn Pieters

0

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

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

如果那不是一个选项,还有一个hacky的解决方案,将操作数转换为浮点数。如果您需要在许多不同的地方进行这种除法运算,可以在模块级别块中添加一个函数:

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

肯定不如你想象中的优雅,但它能够工作。


我的绝大部分逻辑都在视图中,但这种情况是在每个数据行显示之前对其进行一些处理,因此我想将代码保持靠近其使用。我总是可以编写一个帮助函数并导入它,但这确实会很整洁。 - Hollister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接