Python 3.10 coincidencia de patrones (PEP 634) – comodín en cadena
Tengo una larga lista de objetos JSON que quiero analizar dependiendo del inicio de una de las claves, y simplemente poner un comodín para el resto. Muchas de las claves son similares, como “matchme-foo” y “matchme-bar”. Hay un comodín incorporado, pero solo se usa para valores completos, como un else.
Puede que esté pasando por alto algo, pero no puedo encontrar una solución en ninguna parte de la propuesta:
https://docs.python.org/3/whatsnew/3.10.html#pep-634-structural-pattern-matching
También un poco más al respecto en PEP-636:
https://www.python.org/dev/peps/pep-0636/#going-to-the-cloud-mappings
Mis datos se ven así:
data = [{
“id” : “matchme-foo”,
“message”: “hola, este es un mensaje”,
},{
“id” : “matchme-bar”,
“message”: “adiós”,
},{
“id” : “otroid”,
“message”: “evento completamente diferente”
}, …]
Quiero hacer algo que pueda coincidir con el id sin tener que hacer una larga lista de |.
Algo como esto:
for event in data:
match event:
case {‘id’:’matchme-*’}: # Coincidir con todos los ‘matchme-‘ sin importar lo que venga después
log.INFO(event[‘message’])
case {‘id’:’otroid’}:
log.ERROR(event[‘message’])
Es una adición relativamente nueva a Python, por lo que aún no hay muchas guías sobre cómo usarlo.
davy.ai
Basado en la propuesta actual para el emparejamiento de patrones estructurales en Python 3.10, no parece haber una solución incorporada para la coincidencia de comodines en las claves de objetos JSON. Sin embargo, es posible utilizar el emparejamiento de patrones con una función de emparejamiento personalizada para lograr esta funcionalidad deseada.
Un posible enfoque es definir una función de emparejamiento personalizada que verifique el inicio de la clave en el objeto JSON con respecto a un determinado patrón. Por ejemplo:
Luego, esta función de emparejamiento personalizada se puede usar en la declaración de emparejamiento de patrones para emparejar las claves deseadas en el objeto JSON:
En este ejemplo, la función
key_starts_with
se utiliza como un emparejador para el primer caso para emparejar todas las claves que comienzan con"matchme-"
. La condiciónkey == 'anotherid'
en el segundo caso coincide solo con la clave"anotherid"
exactamente.Si bien este enfoque requiere definir una función de emparejamiento personalizada, proporciona la funcionalidad deseada de emparejar claves en el objeto JSON basado en su inicio sin tener que enumerar todas las posibles variaciones con operadores
|
.