web-dev-qa-db-fra.com

Jinja convertit une chaîne en entier

J'essaie de convertir une chaîne qui a été analysée en utilisant une expression régulière en un nombre afin que je puisse la multiplier, en utilisant Jinja2. Ce fichier est un modèle à utiliser dans un script ansible.

J'ai une série de items qui prennent toutes la forme de <Word><number> tel que aaa01, aaa141, bbb05.

L'idée était d'analyser le mot et le numéro (en ignorant les zéros non significatifs) et de les utiliser plus tard dans le modèle.

Je voulais manipuler le nombre par multiplication et l'utiliser. Voici ce que j'ai fait jusqu'à présent ''

{% 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 }}

Avec le modèle ci-dessus, j'obtiens une erreur coercing to Unicode: need string or buffer, int found qui, je pense, me dit qu'il ne peut pas convertir la chaîne en entier, mais je ne comprends pas pourquoi. J'ai vu des exemples faire cela et travailler.

11
SJC

Vous devez convertir la chaîne en entier après le nombre d'expressions régulières:

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

Et puis il n'y a pas besoin de | int à l'intérieur get_Host_range macro.

22