Python puede obtener una sintaxis de coincidencia de patrones

Los creadores del lenguaje Python están reflexionando sobre una nueva propuesta, PEP 622, que finalmente traería una sintaxis de declaración de coincidencia de patrones a Python. Las nuevas declaraciones de coincidencia de patrones darían a los programadores de Python formas más expresivas de manejar datos estructurados, sin tener que recurrir a soluciones alternativas. 

La coincidencia de patrones es una característica común de muchos lenguajes de programación, como switch/caseen C. Permite tomar una de varias acciones posibles en función del valor de una variable o expresión determinada. Si bien Python ha carecido de una sintaxis nativa para la coincidencia de patrones, ha sido posible emularlo con  if/elif/elsecadenas o una búsqueda en el diccionario.

PEP 622 propone un método para hacer coincidir una expresión con varios tipos de patrones utilizando una match/casesintaxis:

coincidir con algo: caso 0 | 1 | 2: print ("Número pequeño") caso [] | [_]: print ("Una secuencia corta") case str () | bytes (): print ("Algo parecido a una cadena") case _: print ("Algo más")

Los tipos de coincidencia de patrones admitidos incluyen literales, nombres, valores constantes, secuencias, una asignación (básicamente, la presencia de un par clave-valor en la expresión), una clase, una combinación de los anteriores o cualquiera de esas expresiones más condicionales. Cualquier coincidencia que sea ambigua o imposible de resolver generará una excepción en tiempo de ejecución.

Los objetos pueden manejar las pruebas de coincidencia mediante un nuevo protocolo llamado __match__protocolo. Si un objeto implementa el __match__método, se puede usar para probar si coincide con un patrón de clase dado y devolver una respuesta adecuada.

PEP 622 también permitiría a los verificadores de tipo estático verificar que las coincidencias se puedan verificar. Un nuevo @sealeddecorador para una clase indica a los verificadores de tipo que cualquier subclase de la clase en cuestión está definida en el mismo módulo que la clase base.

Los PEP anteriores para agregar coincidencia de patrones, PEP 275 y PEP 3103, propuestos en 2001 y 2006 respectivamente, fueron rechazados debido a la falta de apoyo popular. PEP 3103 fue redactado por el creador de Python, Guido van Rossum. El nuevo PEP, creado por van Rossum y varios otros, tiene como objetivo proporcionar expresiones regulares para la coincidencia de objetos, en lugar de un simple if/elif/else sustituto. Los autores señalan que muchos aspectos de este PEP se inspiraron en cómo funciona la coincidencia de patrones en Rust y Scala. 

Cómo se implementaría todo esto bajo el capó aún está en discusión. La implementación propuesta en PEP 622 generaría las mismas secuencias de códigos de bytes que una if/elif/elsecadena. Los switch/casebloques más grandes podrían volverse menos eficaces dependiendo de cuánta lógica condicional se incluyera en cada uno case. Pero el PEP deja en claro que todavía hay sobre la mesa una gran cantidad de enfoques y optimizaciones de rendimiento (por ejemplo, memorización).

Incluso si el PEP termina siendo aceptado, muchas cosas pueden cambiar. Un tema que probablemente será cuestionado es el uso de en case _: lugar de else: como una cláusula general general para la  switch declaración. _ se usa como una variable temporal en muchos contextos, y anular su comportamiento unilateralmente podría ser un desvío para los desarrolladores.