如何解决将字典作为yaml字符串转储,以jinja2.Template的形式使用,该模板评估包含函数
目标是将python字典作为带有pyyaml的yaml字符串转储,然后由jinja2呈现。字典中的值可能包含对由jinja2评估的函数的引用。 注意:它必须是一个yaml字符串,因为它也应该这样存储。
一个例子:
import yaml
import jinja2
my_dict = {
"defined_parameter": "hello","calculated_parameter": "{{ get_word('world') }}"
}
my_yaml = yaml.dump(my_dict)
my_template = jinja2.Template(my_yaml)
my_rendered_yaml = my_template.render(get_word=lambda x: x)
my_rendered_dict = yaml.safe_load(my_rendered_yaml)
此代码引发错误:
jinja2.exceptions.TemplateSyntaxError: expected token ',',got 'world'
由于 my_yaml 如下所示,引发了错误:
calculated_parameter: '{{ get_word(''world'') }}'
defined_parameter: hello
问题在于pyyaml如何转义给get_word()
的参数的单引号。我可以通过以双引号开头来解决此问题:
my_dict = {
"defined_parameter": "hello","calculated_parameter": '{{ get_word("world") }}'
}
这将起作用,因为yaml dumper将始终对字符串值使用单引号。如果字符串中包含单引号,则将其加倍即可将其转义。
不幸的是,我不能依靠用户始终使用双引号输入参数。对我来说,完美的解决方案是影响pyyaml如何转储字符串的行为。
这些都会起作用:
-
calculated_parameter: {{ get_word("world") }}
-
calculated_parameter: {{ get_word('world') }}
-
calculated_parameter: "{{ get_word('world') }}"
-
calculated_parameter: "{{ get_word("world") }}"
-
calculated_parameter: '{{ get_word('world') }}'
-
calculated_parameter: '{{ get_word("world") }}'
很遗憾,我没有找到修改行为的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。