web-dev-qa-db-ja.com

Jinjaは文字列を整数に変換します

Jinja2を使用して、正規表現を使用して解析された文字列を数値に変換できるように変換しようとしています。このファイルは、ansibleスクリプト内で使用されるテンプレートです。

itemsのシリーズがあり、すべて<Word><number> といった aaa01aaa141bbb05

アイデアは、Wordと数値を解析し(先行ゼロを無視して)、テンプレートで後で使用することでした。

乗算で数値を操作して使用したかったのです。以下はこれまでにやったことです `` `

{% 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私はそれが文字列を整数に変換できないと私に言っていると思うが、私は理由を理解していない。これを実行して動作する例を見てきました。

11
SJC

正規表現の後に文字列をintにキャストする必要があります。

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

そして、| int内のget_Host_rangeマクロは不要です。

22