Как получить контроль над пробелами Jinja, чтобы не добавлять дополнительные пробелы в конце цикла for? - PullRequest
0 голосов
/ 30 ноября 2018

Я настраиваю свою среду 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 строки для шаблона и 4-я строка для новой строки в конце файла.

Когда я запускаю свою программу, шаблон запускается, и вывод выглядит примерно так:

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 на эту тему и, конечно, несколько раз прочитал документацию для контроля пробелов.-% в конце моего 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, и у них нет лишних элементов или элементов пробела.

Я просто хочу, чтобы они для циклов отображали шаблоны с одной новой строкой в ​​конце файла, а не двумя новыми строками....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...