Пусть 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.
Это не ошибка. Вы пытаетесь вывести JSON?
Да, я ожидал, что map () вернет список. И это не баг? Значит, map () должна использоваться только как промежуточная функция с добавленным к ней другим фильтром, например | join или | list? Хм. Возможно, это следует прямо указать в документации.
Вы не должны просто распечатывать repr
произвольных объектов Python для прямой передачи в Javascript. В вашем случае, похоже, вам повезло, в зависимости от содержимого, однако вы можете получить недействительный JSON, а также это может быть огромным недостатком безопасности. Добавьте фильтры list
и tojson
чтобы получить действительный JSON, или исключение, если объект не кодируется в JSON.
Тот факт, что repr
большинства встроенных функций Python является JSON-подобным, не является совпадением, но repr никогда не является чем-то, на что следует полагаться для реальной логики программы.
Кроме того, я нигде не вижу в документации Jinja, что подразумевает, что map
вернет что-то более конкретное, чем последовательность.
Я не хочу менять это, так как это приведет к снижению производительности этих функций, которые обычно используются только с итерацией. |list
исправляет.
Я не знал о решении {{ ... | list }}
для проблемы ansbile <generator object do_map at 0xdeadbeef>
.
Спасибо за заполнение!
Самый полезный комментарий
Я не хочу менять это, так как это приведет к снижению производительности этих функций, которые обычно используются только с итерацией.
|list
исправляет.