Coincidencia estructural de patrones, a fondo en Python
Patrones de clase, guardas, y capturar el resto de un mapeo.
from dataclasses import dataclass
@dataclass
class Clic:
x: int
y: int
def describir(evento):
match evento:
case {"kind": "key", "value": str(tecla)} if len(tecla) == 1:
return f"tecla {tecla}"
case {"kind": "key", **resto}:
return f"evento de tecla raro {sorted(resto)}"
case Clic(x=0, y=0):
return "clic en el origen"
case Clic(x=x, y=y):
return f"clic en {x},{y}"
case [primero, *otros]:
return f"lote de {1 + len(otros)} que empieza con {primero!r}"
case _:
return "desconocido"
for evento in [{"kind": "key", "value": "a"}, Clic(0, 0), Clic(3, 4),
["a", "b"], 7]:
print(describir(evento))
Cómo funciona
- Un patrón de clase coincide tipo y atributos a la vez.
{**resto}captura las claves que no nombraste.|combina alternativas en un mismo case.
Palabras clave y builtins usados aquí
_caseclassdefforifintlenmatchprintreturnsortedstr
El intento, en números
- Líneas
- 28
- Caracteres a escribir
- 599
- Tokens
- 212
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 121 segundos.
Paso 3 de 3 en Datos y enums; paso 47 de 53 en Python pythónico.