Mako模板中如何去除前导空格

3
在从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

这个问题中有很多主观性词汇,比如“美丽”、“好看”和“更好看”。但我会尝试回答。如果以下任何一种适合您,请告诉我。

请注意,以下两种选项都可以实现您的要求,但选项#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')]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接