【发布时间】:2016-02-04 04:09:55
【问题描述】:
我们正在将一堆手动生成的代码转换为使用 mako 模板,并且我们正在转换的一些代码使用按位或 (|) 运算符来计算其中的一些值。
例如,原件是这样的:
for my_foo in foo_constants():
output += "#define %s_THING %d\n" % (my_foo.name, my_foo.id | 0x8000)
现在在 mako,我们的第一次尝试是:
% for my_foo in foo_constants():
#define ${my_foo.name}_THING ${my_foo.id | 0x10000}
% endfor
但这抛出了错误TypeError: 'int' object is not callable,因为mako将该行编译为:
__M_writer(65536(unicode(my_foo.id )))
因为 mako 使用 | 字符来表示“将左边的函数传递给右边的函数”。用额外的括号括住表达式,例如${(my_foo.id | 0x10000)},并没有帮助。它产生了
mako.exceptions.SyntaxException: (SyntaxError) invalid syntax (<unknown>, line 1) (u'0x10000),') in file '/tmp/test_template.mako' at line: 2 char: 29
目前,我们将在模板的上下文中添加一个 bit_or 函数并调用它,但由于 mako 文档似乎根本没有提到这个问题,我想知道是否有明显的解决方案我们不见了。
更新:从 Mako 1.0.4 版开始,解决方案是额外增加一层括号:
% for my_foo in foo_constants():
#define ${my_foo.name}_THING ${(my_foo.id | 0x10000)}
% endfor
(这在 1.0.3 版中不起作用,这是发布此问题时的当前版本)
【问题讨论】:
-
也许在未来的某个时候,paren 方法会起作用:github.com/zzzeek/mako/pull/19