Jinja: фильтр map () возвращает строку "<generator object="" do_map="" at="">"</generator>

Созданный на 3 янв. 2014  ·  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? Хм. Возможно, это следует прямо указать в документации.

Вы не должны просто распечатывать repr произвольных объектов Python для прямой передачи в Javascript. В вашем случае, похоже, вам повезло, в зависимости от содержимого, однако вы можете получить недействительный JSON, а также это может быть огромным недостатком безопасности. Добавьте фильтры list и tojson чтобы получить действительный JSON, или исключение, если объект не кодируется в JSON.

Тот факт, что repr большинства встроенных функций Python является JSON-подобным, не является совпадением, но repr никогда не является чем-то, на что следует полагаться для реальной логики программы.

Кроме того, я нигде не вижу в документации Jinja, что подразумевает, что map вернет что-то более конкретное, чем последовательность.

Я не хочу менять это, так как это приведет к снижению производительности этих функций, которые обычно используются только с итерацией. |list исправляет.

Я не знал о решении {{ ... | list }} для проблемы ansbile <generator object do_map at 0xdeadbeef> .

Спасибо за заполнение!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги