Obtuve una gran lista de objetos JSON que quiero analizar según el inicio de una de las claves, y solo comodín 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 .
Podría estar 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 sobre esto 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": "hallo this is a message", },{ "id" : "matchme-bar", "message": "goodbye", },{ "id" : "anotherid", "message": "completely diffrent event" }, ...] Quiero hacer algo que pueda coincidir con la identificación sin tener que hacer una larga lista de | 's.
Algo como esto:
for event in data: match event: case {'id':'matchme-*'}: # Match all 'matchme-' no matter what comes next log.INFO(event['message']) case {'id':'anotherid'}: 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.
Puedes usar un protector :
for event in data: match event: case {'id': x} if x.startswith("matchme"): # guard print(event["message"]) case {'id':'anotherid'}: print(event["message"])Citando de la documentación oficial ,
Guardia
Podemos agregar una cláusula
ifa un patrón, conocida como "guardia". Si la guardia esfalse, el partido continúa para intentar el siguiente bloque decase. Tenga en cuenta que la captura de valor ocurre antes de que se evalúe el guardia:match point: case Point(x, y) if x == y: print(f"The point is located on the diagonal Y=X at {x}.") case Point(x, y): print(f"Point is not on the diagonal.")
Ver también: