Guido van Rossum propuso agregar operadores de coincidencia de patrones a Python

Guido van Rossum presentado borrador para revisión de la comunidad especificaciones para implementar operadores de coincidencia de patrones (coincidencia y caso) en Python. Cabe señalar que en 2001 y 2006 ya se publicaron propuestas para agregar operadores de coincidencia de patrones (pep-0275, pep-3103), pero fueron rechazados a favor de optimizar la construcción “if... elif... else” para compilar cadenas coincidentes.

La nueva implementación es muy parecida al operador "coincidencia" proporcionado en Scala, Rust y F#, que compara el resultado de una expresión especificada con una lista de patrones enumerados en bloques basados ​​en el operador "caso". A diferencia del operador "switch" disponible en C, Java y JavaScript, las expresiones basadas en "match" ofrecen mucho más amplia funcionalidad. Cabe señalar que los operadores propuestos mejorarán la legibilidad del código, simplificarán la comparación de objetos Python arbitrarios y la depuración, y también aumentarán la confiabilidad del código debido a la posibilidad de extensión. verificación de tipo estático.

def http_error(estado):
estado del partido:
caso 400:
devolver "Solicitud incorrecta"
caso 401|403|404:
devolver "No permitido"
caso 418:
volver "soy una tetera"
caso _:
devolver "algo más"

Por ejemplo, puede descomprimir objetos, tuplas, listas y secuencias arbitrarias para vincular variables basadas en valores existentes. Se permite definir plantillas anidadas, usar condiciones “if” adicionales en la plantilla, usar máscaras (“[x, y, *rest]”), asignaciones de clave/valor (por ejemplo, {“bandwidth”: b, “latency ”: l} para extraer valores y diccionario de "ancho de banda" y "latencia"), extraer subplantillas (":=" operador), usar constantes con nombre en la plantilla. En las clases, es posible personalizar el comportamiento de coincidencia utilizando el método “__match__()”.

de clases de datos importar clases de datos

@clase de datos
Punto de clase:
x:int
y:int

def dónde está (punto):
punto decisivo:
caso Punto (0, 0):
imprimir("Origen")
caso Punto (0, y):
imprimir(f"Y={y}")
caso Punto(x, 0):
imprimir(f"X={x}")
Punto de caso():
imprimir("En otro lugar")
caso _:
print("No es punto")

punto decisivo:
caso Punto(x, y) si x == y:
imprimir(f"Y=X en {x}")
caso Punto (x, y):
print(f"No en la diagonal")

ROJO, VERDE, AZUL = 0, 1, 2
color del partido:
caso .ROJO:
print("¡Veo rojo!")
caso .VERDE:
imprimir("La hierba es verde")
caso .BLU
E:
print(“Me siento triste :(“)

Se ha preparado un conjunto para su revisión. parches con experimentos implementación especificación propuesta, pero la versión final aún está siendo discutido. Por ejemplo, propuesto En lugar de la expresión "case _:" para el valor predeterminado, utilice la palabra clave "else:" o "default:", ya que "_" en otros contextos se utiliza como variable temporal. También es cuestionable la organización interna, que se basa en traducir nuevas expresiones a código de bytes similar al utilizado para las construcciones "if... elif... else", que no proporcionará el rendimiento deseado al procesar conjuntos de comparaciones muy grandes.

Fuente: opennet.ru

Añadir un comentario