es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Concatenación de cadenas en Jinja2 pero eliminando la última coma.

Estoy intentando escribir la configuración de VLAN del puerto de interruptor y se rompe debido a la última coma en la salida, estoy intentando obtener una salida de la siguiente manera
vlan trunk allowed 2600,2610,2620,2630,2640,2650
pero obtengo
vlan trunk allowed 2600,2610,2620,2630,2640,2650,

Mi código actualmente se ve así

{% for i in interfaces|default([]) %}
interface {{ i.port }}
    no shutdown
    mtu {{ mtu }}
    description Link_to_{{ i.peer|lower }}
    no routing
    vlan trunk native 1
    vlan trunk allowed {% for vc in vlans_core %}{% if vc.src == inventory_hostname and vc.dst == i.peer %}{{ vc.tag }},{% endif %}{% endfor %}{% for vc in vlans_core %}{% if vc.dst == inventory_hostname and vc.src == i.peer %}{{ vc.tag }},{% endif %}{% endfor %}

{% endfor %}

Intenté usar “join” pero solo produjo errores.

{{ vc.tag|join(", ") }}

También intenté usar “loop.last” pero esto tampoco funcionó.

{% if not loop.last %},{% endif %}

Cualquier ayuda sería apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basado en tu código, parece que estás utilizando el lenguaje de plantillas jinja2 para generar la configuración del VLAN de los puertos del switch. Estás utilizando un bucle for para iterar a través de los VLAN y concatenarlos con un separador de coma. Sin embargo, estás obteniendo una coma extra al final de tu resultado.

    Una forma de resolver este problema es utilizar el atributo “loop.last”, que devuelve verdadero si la iteración actual es la última. Puedes usarlo dentro del bucle for para agregar un separador de coma solo si no es la última iteración. Aquí tienes un ejemplo:

    vlan trunk allowed {% for vc in vlans_core %}{% if vc.src == inventory_hostname and vc.dst == i.peer %}{{ vc.tag }}{% if not loop.last %},{% endif %}{% endif %}{% endfor %}{% for vc in vlans_core %}{% if vc.dst == inventory_hostname and vc.src == i.peer %}{{ vc.tag }}{% if not loop.last %},{% endif %}{% endif %}{% endfor %}
    

    En este ejemplo, estamos utilizando la condición “not loop.last” dentro del bucle for para agregar un separador de coma solo si no es la última iteración. Esto debería eliminar la coma extra al final de tu resultado.

    Otra alternativa es utilizar el filtro “join” para concatenar los VLAN y el separador de coma. Aquí tienes un ejemplo:

    vlan trunk allowed {{ vlans_core | selectattr("src", "equalto", inventory_hostname) | selectattr("dst", "equalto", i.peer) | map(attribute="tag") | join(",") }}
    

    En este ejemplo, estamos utilizando el filtro “selectattr” para filtrar los VLAN en función de los atributos “src” y “dst”, y el filtro “map” para obtener solo el atributo “tag”. Finalmente, utilizamos el filtro “join” para concatenar los VLAN con el separador de coma.

    Espero que esto te ayude. Déjame saber si tienes alguna otra pregunta.

Comments are closed.