Python 在mako表达式中使用按位or
我们正在将一堆手工生成的代码转换为使用mako模板,我们正在转换的一些代码使用了按位or(Python 在mako表达式中使用按位or,python,mako,Python,Mako,我们正在将一堆手工生成的代码转换为使用mako模板,我们正在转换的一些代码使用了按位or(|)运算符来计算它的一些值 例如,原文是这样的: 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}
|
)运算符来计算它的一些值
例如,原文是这样的:
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”对象不可调用,因为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
(这在1.0.3版中不起作用,这是发布此问题时的当前版本)非常接近,您可以尝试只按位计算或在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
也许在将来的某个时候,帕伦方法会起作用:
<%
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