如何使Jinja空格控件在for循环的末尾不添加其他空格?

时间:2018-11-29 22:01:24

标签: python jinja2

我在程序开始时按如下方式配置Jinja环境:

jinja_env = Environment(
loader = FileSystemLoader(
    build_methods.get_absolute_path(
        absolute_path_of_this_file, 
        constants.JINJA_TEMPLATES_PATH
        )
    ), 
trim_blocks = True, 
lstrip_blocks = True, 
keep_trailing_newline = False
)

我有以下Jinja模板:

{% for alter_table_column in alter_table_list -%}
    ALTER TABLE {{ schema_name }}.{{ table_name }} DROP COLUMN {{ alter_table_column }};
{% endfor -%}

在文件末尾有一个未以SO呈现的换行符。 我重复一遍。我的模板是4行。在文件末尾,模板的3行和换行的第四行。

运行程序时,模板将运行,并且输出看起来像这样:

ALTER TABLE table DROP COLUMN column1;
ALTER TABLE table DROP COLUMN column2;
ALTER TABLE table DROP COLUMN column3;
ALTER TABLE table DROP COLUMN column4;

在此文件末尾带有 2个换行符(因此无法渲染...)。

我无能为力,因为我什么都不做。总会出现此额外的新行,这会影响随后的操作,这些操作会将文件的行读取为列表。这样的列表的末尾有一个空字符串。

我只能做一件事情来使它工作,但我发现这很丑。

{% for alter_table_column in alter_table_list -%}
    ALTER TABLE {{ schema_name }}.{{ table_name }} DROP COLUMN {{ alter_table_column }};{% if not loop.last %}{{ '\n' }}{% endif %}
{% endfor -%}

这有效,并且渲染正确,文件末尾只有一行。

我已经不知所措了。我已经搜索了关于该主题的每篇SO帖子,并且我当然读过documentation来进行空白控制。 -%块末尾的endfor应该去掉空白。我在程序中用于渲染Jinja模板的所有调用都使用相同的jinja_env,并且在创建后不修改此环境。我读过,创建后修改环境可能会导致问题。

我呈现模板的功能如下:

def render_templates(jenv, template_file_name, render_args):
    template = jenv.get_template(template_file_name)
    return template.render(render_args)

def render_templates_to_file(jenv, template_file_name, resolved_template_filename, render_args):
    with open(resolved_template_filename, constants.WRITE_OPTION) as outfile:
        print(render_templates(jenv, template_file_name, render_args), file = outfile)

为了确定,我检查了用于渲染Jinja模板的列表,它们没有多余的元素或空白元素。

我只希望这些for循环使用文件末尾的一行而不是两行来呈现模板。

0 个答案:

没有答案