Это линия, которая доставляет вам неприятности: {% for int in int_details_{{item.hostname}} %}
. Вы не можете использовать расширение переменной jinja2 внутри инструкции jinja2.
Это решит вашу текущую проблему: {% for int in lookup('vars', 'int_details_' + item.hostname) %}
Это - micro-micro-optimization (и возможно что-то обработанное компилятором так или иначе). Не волнуйтесь об этом. Вы получите намного больший возврат путем фокусировки на программах фактического алгоритма.
Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла. - Donald Knuth
Это на самом деле (очень, очень немного) менее эффективно. Переменные присвоения примерно эквивалентны пустым проверкам, плюс существует дополнительное возможное ответвление. Не то, чтобы это имеет много значения.
Или это не вызывает беспокойство ни о чем?
Вы получили его.
Я не волновался бы об этом - это - просто дополнительные строки кода для поддержания. Это - вид микрооптимизации, которую Вы никогда не должны делать, если у Вас нет большого количества зарегистрированного доказательства, что это - Ваше узкое место.
Если у Вас будет достойный компилятор, то они сгенерируют идентичный код. Если у Вас есть дрянной компилятор тот с if
будет хуже. На 2 009 аппаратных присвоениях на переменные являются очень дешевыми, и условные переходы могут иногда быть дорогими.
В первую очередь, это - микро оптимизация. Так никакая потребность волноваться очень об этом.
Но отвечать на Ваш вопрос, необходимо уменьшить его всего до одной строки. (поскольку весь Ваш код делает должен установить его в NULL).
foo = NULL;
Причем причины - это,
Сравнение является намного намного более дорогостоящей операцией, чем присвоение. (Поскольку сравнение съедает много инструкций по сборке сравнительно. Обычно вычитание и сравнение с нулем или XOR и сравнение с нулем). Присвоение поднимает меньше инструкций.
foo = null;
if (foo != null)
foo = null;
Если бы я смотрю на второй блочный код, я думал бы, что Вы только хотели установить переменную нечто в NULL, если бы это не было пустым прежде, и если бы я смотрю на первый код, я думал бы, что Вы хотели установить переменное нечто в NULL так или иначе.
Я знаю, что это из-за примера, который Вы записали, но в конце этот вид микрооптимизации только добавляет беспорядок (это не стоит того).
Это сделает Ваш код настолько тяжелее, чтобы считать что, даже если бы это была оптимизация, это не стоило бы проблемы.
И это не оптимизация. На самом современном CPU, если операторы являются довольно дорогими.
Это будет иметь минимальный эффект. Я не думаю, что Вы могли даже создать сравнительный тест для демонстрации различия.
На самом деле некоторые утверждали бы, что присвоение пустому указателю вообще является запахом кода (см. детектор PMD для NullAssignment):
Присвоение "пустого указателя" к переменной (за пределами ее объявления) является обычно невоспитанностью. Несколько раз присвоение является признаком, что программист не полностью понимает то, что продолжается в коде.Примечание: Этот вид мая присвоения в редких случаях быть полезным для поощрения сборки "мусора". Если это - то, что Вы используете его для, любой ценой, игнорируйте это правило :-)
В целом я лично подозрителен что-либо, что пытается поощрить сборку "мусора" (Вы почти всегда получаете эффекты, которые Вы не ожидали).