使用按位或mako表达式

时间:2016-02-04 04:09:55

标签: python mako

我们正在将一堆手动代码生成内容转换为使用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版本中无法正常工作,这是发布此问题时的当前版本)

1 个答案:

答案 0 :(得分:1)

非常接近,您可以尝试仅按位或在for循环中进行评估。这对我有用

<%
    class foo(object):
        def __init__(self, name, id):
            self.name = name
            self.id = id
    foo_list = [foo('name1', 123), foo('name2', 23423), foo('name3', 3450)]
%>
% for my_foo in foo_list:
    <% foo_id = my_foo.id | 0x8000 %>
#define ${my_foo.name}_THING ${foo_id}
% endfor

,输出

#define name1_THING 32891

#define name2_THING 56191

#define name3_THING 36218