Я настраиваю свою среду 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, и у них нет лишних элементов или элементов пробела.
Я просто хочу, чтобы они для циклов отображали шаблоны с одной новой строкой в конце файла, а не двумя новыми строками....