【问题标题】:Using bitwise or in mako expression在 mako 表达式中使用按位或
【发布时间】: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 版中不起作用,这是发布此问题时的当前版本)

【问题讨论】:

标签: python mako


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2013-08-04
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多