Python Jinja2 调用宏会导致(不需要的)换行符

Rag*_*ugu 4 python macros jinja2

我的 JINJA2 模板如下所示。

\n\n
{% macro print_if_john(name) -%}\n{% if name == \'John\' -%}\n  Hi John\n{%- endif %}\n{%- endmacro %}\nHello World!\n{{print_if_john(\'Foo\')}}\n{{print_if_john(\'Foo2\')}}\n{{print_if_john(\'John\')}}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果输出是

\n\n
Hello\xe2\x80\xa2World!\n\n\nHi\xe2\x80\xa2John\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不想要“Hello World!”和“Hi John”之间的 2 个换行符。看起来当对宏的调用导致宏没有输出时,JINJA 无论如何都会插入换行符。有什么方法可以避免这种情况吗?我在宏本身的调用中添加了减号,但这没有帮助。

\n\n

请注意,我在http://jinja2test.tk/测试了此模板和生成的代码

\n

Mar*_*ers 5

换行符来自{{print_if_john(...)}}行本身,而不是宏。

如果您要将它们连接起来或-在这些块中使用,换行符就会消失:

>>> from jinja2 import Template
>>> t = Template('''\
... {% macro print_if_john(name) -%}
... {% if name == 'John' -%}
...   Hi John
... {% endif %}
... {%- endmacro -%}
... Hello World!
... {{print_if_john('Foo')-}}
... {{print_if_john('Foo2')-}}
... {{print_if_john('John')-}}
... ''')
>>> t.render()
u'Hello World!\nHi John\n'
>>> print t.render()
Hello World!
Hi John
Run Code Online (Sandbox Code Playgroud)

请注意,您仍然可以在块内使用换行符和其他空格{{...}}

-我从块中删除了首字母{% endif %},因为当您从块中删除换行符时{{..}},您希望在实际打印该行时添加一个换行符Hi John。这样多个print_if_john('John')调用仍然会得到它们的行分隔符。

完整模板,来自演示会话:

>>> from jinja2 import Template
>>> t = Template('''\
... {% macro print_if_john(name) -%}
... {% if name == 'John' -%}
...   Hi John
... {% endif %}
... {%- endmacro -%}
... Hello World!
... {{print_if_john('Foo')-}}
... {{print_if_john('Foo2')-}}
... {{print_if_john('John')-}}
... ''')
>>> t.render()
u'Hello World!\nHi John\n'
>>> print t.render()
Hello World!
Hi John
Run Code Online (Sandbox Code Playgroud)