>>> from jinja2 import Template
>>> template = Template("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> template.render(foo='foobar', bar='barbaz', baz='bazfoo')
('foobar', 'barbaz', 'bazfoo')
>>> from jinja2.nativetypes import NativeEnvironment
>>> e = NativeEnvironment()
>>> t = e.from_string("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> t.render(foo='foobar', bar='barbaz', baz='bazfoo')
'foobar, barbaz, bazfoo'
试图找到对上述内容的解释。 在解释器中对此进行了测试,以将其缩小到仅 Jinja2,而没有其他可能调用它的东西,例如将 jinja2_native 设置为 True 的 Ansible。
当不使用 jinja2_native 时,我们得到了上面的预期行为,即三个替换发生在每个值周围用单引号引起来。 当 jinja2_native 设置为 true 时(在如上所示的 NativeEnvironment 中),字符串中的内部单引号将被忽略,并返回带有三个替换的单个字符串。
即使单引号之间有附加字符,也会发生这种情况:
>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"
任何帮助,将不胜感激。
添加一点关于为什么会发生这种情况(或多或少)的注释:模板"--foo='{{ foo }}' --bar='{{ bar }}'"
被分解为以下节点:
--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
问题发生在native_concat
处理 3. ' --bar='
, literal_eval
那里看到一个字符串,去掉引号并返回--bar=
这是正确的,只是不在这种情况:)
@davidism 有什么想法吗?
最有用的评论
添加一点关于为什么会发生这种情况(或多或少)的注释:模板
"--foo='{{ foo }}' --bar='{{ bar }}'"
被分解为以下节点:--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
问题发生在
native_concat
处理 3.' --bar='
,literal_eval
那里看到一个字符串,去掉引号并返回--bar=
这是正确的,只是不在这种情况:)@davidism 有什么想法吗?