删除 Mako 模板中的前导空格

Posted

技术标签:

【中文标题】删除 Mako 模板中的前导空格【英文标题】:Remove leading whitespace in Mako template 【发布时间】:2015-07-17 02:53:41 【问题描述】:

在从 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 模板很好地缩进?我使用空 &lt;% %&gt; 的解决方案并不完美。

【问题讨论】:

【参考方案1】:

这个问题中有很多主观词,如beautifulnice,以及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')]))

【讨论】:

以上是关于删除 Mako 模板中的前导空格的主要内容,如果未能解决你的问题,请参考以下文章

如何删除前导和尾随的空格以及字符串中的多个空格? [复制]

删除 JSON 键中的前导和尾随空格

如何删除 MySQL 字段中的前导和尾随空格?

前导和尾随空格剪切 + 中间空格替换

删除 Eclipse 中单行注释中多余的前导空格

模板过滤器修剪任何前导或尾随空格