删除Mako模板中的前导空格

时间:2015-05-06 19:20:18

标签: templates whitespace mako removing-whitespace

在一个用于从Mako模板自动生成代码的用例中,我想要一个很好的语法来删除前导空格(类似于在一行末尾删除带有\的换行符)。

以下代码

from mako.template import Template

# 1) Bad
print(Template(r'''
    void myfunction(\
    %for arg_name, arg_type in arguments:
        ${', ' if loop.index else ''}${arg_type} ${arg_name}\
    %endfor
    )
''').render(arguments=[('string', 'a'), ('int', 'b')]))

# 2) Good but ugly
print(Template(r'''
    void myfunction(\
    %for arg_name, arg_type in arguments:
<%    %>${', ' if loop.index else ''}${arg_type} ${arg_name}\
    %endfor
<%%>)
''').render(arguments=[('string', 'a'), ('int', 'b')]))

将打印这些结果:

void myfunction(        a string        , b int    )
void myfunction(a string, b int)

我想要后一个输出 - 所以有没有更好的语法,同时仍然保持我的Mako模板很好地缩进?我的空<% %>解决方案并不完美。

1 个答案:

答案 0 :(得分:0)

在这个问题中有很多主观词汇,例如 beautiful nice ,以及 nicer 。但我会试一试。如果其中任何一个符合您的要求,请告诉我。

请注意,以下两个都按照您的要求执行,但选项#1可能是最容易阅读的,但它也会删除void之前的所有空格,这可能不是预期的。选项#2应该适用于您描述的内容。

使用下面的选项#2,您可以替换您最喜欢的任何字符,以表示应删除以下所有空格。

import re

# 1) Better?
print(Template(r'''
    void myfunction(\
    %for arg_name, arg_type in arguments:
        ${', ' if loop.index else ''}${arg_type} ${arg_name}\
    %endfor
    )
'''.replace('  ', '')).render(arguments=[('string', 'a'), ('int', 'b')]))

# 2) More Better?
print(Template(re.sub(r'>\s*', '', r'''
    void myfunction(\
    %for arg_name, arg_type in arguments:
>       ${', ' if loop.index else ''}${arg_type} ${arg_name}\
    %endfor
>   )
''')).render(arguments=[('string', 'a'), ('int', 'b')]))