REVIT ARCHITECTURE (987) – PYTHON – Bucles (71) – Bucles con else en Python aplicados a Revit

En Python, tanto los bucles while como los for pueden llevar una cláusula especial: else.
Esta parte del código se ejecuta cuando el bucle termina normalmente, es decir:

  • Si el bucle se ejecuta hasta el final → entra en else.

  • Si el bucle se interrumpe con un break → el bloque else no se ejecuta.

Vamos a verlo con ejemplos.

Ejemplo 1: while con else

Explicación línea por línea del código

contador = 0 → Inicializamos una variable.

while contador < 3: → Repite mientras el valor sea menor que 3.

print(«Iteración:», contador) → Imprime el valor en cada paso.

contador += 1 → Incrementa en 1.

else: → Cuando la condición del while deja de cumplirse (es decir, contador llega a 3)…

print(«Bucle terminado…») → … se ejecuta este mensaje final.

Salida:

Ejemplo 2: for con else

Recorremos una lista de materiales y, al terminar, confirmamos el proceso.

Explicación línea por línea

materiales = […] → Lista de elementos a recorrer.

for m in materiales: → Itera sobre cada material.

print(«Procesando:», m) → Muestra el material actual.

else: → Cuando el bucle termina de recorrer la lista…

print(«Todos los materiales…») → … ejecuta la confirmación final.

Salida:

Aplicación al flujo Revit Open Source Converter

En el contexto de un Open Source Converter para Revit, else es muy útil cuando quieres:

  • Confirmar que se procesaron todos los elementos sin errores.

  • Ejecutar una acción final sólo si el bucle no fue interrumpido por un break.

Ejemplo aplicado:

En este caso:

Si un muro falla, se usa break y el mensaje final no aparece.

Si todos pasan, el bloque else confirma la exportación exitosa.

Llama a obtener_muros_revit() para recuperar todos los muros del modelo (p. ej., una lista de dicts u objetos).

El resultado se guarda en muros, que debe ser iterable (lista, generador, etc.).

Inicia un bucle que recorre uno a uno los elementos de muros.

En cada iteración, muro referencia al elemento actual (con campos como id, tipo, material, …).

Comprueba si el muro no tiene material definido.

muro.get(«material») devuelve el valor de la clave «material» o None si no existe.

Con not, la condición será True si el material es None, «» (cadena vacía) u otro valor considerado “falsy”.

Muestra un mensaje de error informando que el muro carece de material.

Detiene el bucle for por completo en el primer muro con material inválido.

Nada más dentro del for se ejecuta y se salta directamente fuera del bucle.

Si el muro sí tiene material, se ejecuta la exportación.

Aquí iría la lógica para serializar/convertir el muro (p. ej., a JSON/IFC) o registrarlo en el Open Source Converter.

En Python, un for puede tener else.

Este else se ejecuta sólo si el bucle terminó “con normalidad”, es decir:

Se recorrieron todos los elementos sin ejecutar break.

Si hubo un break, no entra al else.

Mensaje de éxito global: confirma que ningún muro provocó ruptura y todos los procesables se exportaron.

Explicación de esta línea de código:

  1. print(...)

    • Es la función incorporada de Python que envía texto a la salida estándar (normalmente la consola).

    • Todo lo que pongas dentro de los paréntesis se muestra tal cual en pantalla.

  2. El texto "✅ Todos los muros se exportaron correctamente."

    • Es una cadena de caracteres (string).

    • Contiene un emoji () más un mensaje descriptivo.

    • Python lo interpreta como un valor de tipo str.

  3. ¿Por qué está dentro del else del bucle?

    • Este print solo se ejecuta si el bucle for muro in muros: ha terminado sin ser interrumpido por un break.

    • Eso significa que:

      • Todos los muros tenían material.

      • Se exportaron correctamente uno por uno.

En resumen: es un mensaje de confirmación global que indica que el proceso terminó sin errores y todos los muros fueron exportados con éxito en el flujo del Open Source Converter.

Qué pasa en conjunto

  1. Recorre los muros.

  2. Si aparece uno sin material, muestra error y detiene la exportación (no hay mensaje final).

  3. Si ninguno dispara break, al terminar el bucle se imprime la confirmación de éxito.

Detalles útiles

  • Si muros está vacío, el for no itera y el else se ejecuta (porque no hubo break). Ajusta el mensaje si quieres distinguir “no había muros” de “todo correcto”.

  • Si prefieres saltar muros sin material pero continuar con el resto, usa continue en lugar de break.

  • .get("material") evita KeyError. Si requieres material no vacío, valida también espacios:

Esta línea de código es más avanzada porque usa el operador de asignación en expresiones (:=), conocido como walrus operator. Vamos paso a paso:

1. (m := muro.get("material"))

  • Aquí usamos el walrus operator (:=).

  • Lo que hace es asignar el resultado de muro.get("material") a la variable m, dentro de la condición.

  • Es equivalente a:

  • Pero más compacto.

  • muro.get("material") devuelve:

    • El valor de "material" si existe,

    • o None si la clave no está en el diccionario.

2. not (m := muro.get("material"))

  • La primera condición comprueba si m es “falsy”, es decir:

    • None, "" (cadena vacía), 0, False

  • Si eso ocurre, significa que el muro no tiene material válido.

3. or not str(m).strip()

  • Si m existe, lo convertimos en str(m) para asegurarnos de que tratamos con texto.

  • .strip() elimina espacios en blanco al inicio y al final.

  • not str(m).strip() será True si la cadena está vacía después de quitar espacios, es decir, el material es solo " " (espacios en blanco).

4. En conjunto

  • Se activa el if cuando:

    1. El muro no tiene clave "material" o está en blanco (None, "", 0, etc.).

    2. El material existe pero es solo espacios vacíos.

En otras palabras:
Este if detecta cualquier muro con material vacío, nulo o mal definido.

Bonus: uso combinado con while

Podemos usar else también en un ciclo de búsqueda. Ejemplo: buscar un muro con cierto ID.

  • Si encuentra el muro → se ejecuta break y el else no corre.

  • Si recorre toda la lista sin hallarlo → el else muestra un aviso.

Conclusión: la cláusula else en bucles es una herramienta poco conocida, pero muy práctica para controlar flujos de validación y confirmar procesos completos, tanto en Python básico como en la automatización de modelos Revit.

Licencia Creative Commons@Yolanda Muriel Attribution-NonCommercial-NoDerivs 3.0 Unported (CC BY-NC-ND 3.0)

Deja un comentario