Jinja: map() 过滤器返回字符串“<generator object="" do_map="" at="">”</generator>

创建于 2014-01-03  ·  7评论  ·  资料来源: pallets/jinja

让 zonelist 成为这样的数据结构:

[{'zones': ['pe.com', 'ps.de', 'p-s.de'], 'file': 'gm'},
 {'zones': ['p-e.net', 'ps.net', 'p-s.net'], 'file': 'grpc'}]

使用 zonelist|map(attribute='file') 时,会返回这样的字符串:

<generator object do_map at 0x10bd730>

预期的行为是返回一个包含 zonelist 的“文件”属性的列表。

事实证明有一个解决方法:使用例如 zonelist|map(attribute='file') |list或 zonelist|map(attribute='file') |sort将产生预期的列表:

[gm, grpc]

我正在使用 Jinja 2.7.1 和 Ansible 1.4.3。

最有用的评论

我不想改变这一点,因为这会导致这些函数的性能下降,而这些函数通常只用于迭代。 |list修复它。

所有7条评论

这不是一个错误。 你想输出JSON吗?

是的,我的期望是 map() 返回一个列表。 这不是一个错误? 所以这意味着 map() 只能用作中间函数,并附加一些其他过滤器,如 |join 或 |list? 嗯。 也许这应该在文档中明确说明。

您不应该只是打印出任意 Python 对象的repr以直接提供给 Javascript。 在您的情况下,您似乎很幸运,具体取决于内容,但是,您实际上可能会得到无效的 JSON,这也可能是一个巨大的安全漏洞。 附加listtojson过滤器以获取有效的 JSON,或者当对象无法编码为 JSON 时出现异常。

大多数 Python 内置函数的repr是 JSON-ish 的事实并非巧合,但 repr 绝不是实际程序逻辑应该依赖的东西。

另外,我在Jinja 文档中没有看到任何暗示map会返回比序列更具体的东西。

我不想改变这一点,因为这会导致这些函数的性能下降,而这些函数通常只用于迭代。 |list修复它。

我不知道 ansbile <generator object do_map at 0xdeadbeef>问题的{{ ... | list }}解决方案。

感谢您提交此文件!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

harobed picture harobed  ·  6评论

humiaozuzu picture humiaozuzu  ·  3评论

glasserc picture glasserc  ·  4评论

mitsuhiko picture mitsuhiko  ·  3评论

dwt picture dwt  ·  3评论