Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在mako表达式中使用按位or_Python_Mako - Fatal编程技术网

Python 在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}

我们正在将一堆手工生成的代码转换为使用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}_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