Jinja преобразовать строку в целое число

#python #ansible #jinja2

#python #ansible #jinja2

Вопрос:

Я пытаюсь преобразовать строку, которая была проанализирована с использованием регулярного выражения, в число, чтобы я мог умножить его, используя Jinja2. Этот файл является шаблоном, который будет использоваться в скрипте ansible.

У меня есть серия, все из items которых имеют форму <word><number> , такую как aaa01 , aaa141 , bbb05 .

Идея заключалась в том, чтобы разобрать слово и число (игнорируя начальные нули) и использовать их позже в шаблоне.

Я хотел манипулировать числом путем умножения и использовать его. Ниже то, что я сделал до сих пор «

 {% macro get_host_number() -%}
{{ item | regex_replace('^D*[0]?(d*)$', '\1') }}
{%- endmacro %}

{% macro get_host_name() -%}
{{ item | regex_replace('^(D*)d*$', '\1') }}
{%- endmacro %}

{% macro get_host_range(name, number) -%}
{% if name=='aaa' %}
{{ ((number*5) 100) | int | abs }}
{% elif name=='bbb' %}
{{ ((number*5) 200) | int | abs }}
{% else %}
{{ ((number*5) 300) | int | abs }}
{% endif %}
{%- endmacro %}

{% set number = get_host_number() %}
{% set name = get_host_name() %}
{% set value = get_host_range(name, number) %}

Name: {{ name }}
Number: {{ number }}
Type: {{ value }}
  

С помощью приведенного выше шаблона я получаю сообщение об ошибке coercing to Unicode: need string or buffer, int found , которое, я думаю, говорит мне, что оно не может преобразовать строку в целое число, однако я не понимаю, почему. Я видел примеры, делающие это и работающие.

Комментарии:

1. Это сообщение об ошибке означает, что вы передаете целое число там, где ожидалась строка. В какой строке возникает ошибка?

Ответ №1:

Вам нужно преобразовать строку в int после числа регулярных выражений:

 {% set number = get_host_number() | int %}
  

И тогда нет необходимости во | int внутреннем get_host_range макросе.