Guido van Rossum propuxo engadir operadores de coincidencia de patróns a Python

Guido van Rossum introducido borrador para revisión comunitaria especificacións para implementar operadores de coincidencia de patrón (coincidencia y mayúsculas) en Python. Cómpre sinalar que xa se publicaron propostas para engadir operadores de coincidencia de patróns en 2001 e 2006 (pep-0275, pep-3103), pero foron rexeitados a favor de optimizar a construción "if ... elif ... else" para compilar cadeas coincidentes.

A nova implementación é moi parecida ao operador "coincidir" proporcionado en Scala, Rust e F#, que compara o resultado dunha expresión especificada cunha lista de patróns listados en bloques baseados no operador "case". A diferenza do operador "switch" dispoñible en C, Java e JavaScript, as expresións baseadas en "coincidencia" ofrecen moito máis ampla funcionalidade. Nótase que os operadores propostos mellorarán a lexibilidade do código, simplificarán a comparación de obxectos arbitrarios de Python e a depuración e tamén aumentarán a fiabilidade do código grazas á posibilidade de ampliar comprobación de tipo estático.

def http_error(estado):
estado de coincidencia:
caso 400:
devolver "Petición incorrecta"
caso 401|403|404:
devolver "Non permitido"
caso 418:
volver "Eu son unha tetera"
caso_:
devolver "Algo máis"

Por exemplo, pode desempaquetar obxectos, tuplas, listas e secuencias arbitrarias para vincular variables en función dos valores existentes. Permítese definir modelos anidados, usar condicións adicionais "se" no modelo, usar máscaras ("[x, y, *rest]"), asignacións clave/valor (por exemplo, {"bandwidth": b, "latency") ”: l} para extraer valores de "ancho de banda" e "latencia" e dicionario), extraer submodelos ("operador:="), usar constantes nomeadas no modelo. Nas clases, é posible personalizar o comportamento de coincidencia usando o método "__match__()".

desde dataclasses importar dataclass

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

def whereis (punto):
punto de coincidencia:
Punto do caso (0, 0):
print("Orixe")
Punto do caso (0, y):
imprimir(f"Y={y}")
Punto do caso (x, 0):
imprimir(f"X={x}")
punto de caso():
print("Outro lugar")
caso_:
print("Non é un punto")

punto de coincidencia:
caso Punto(x, y) se x == y:
imprimir(f"Y=X en {x}")
caso Punto (x, y):
print(f"Non na diagonal")

VERMELLO, VERDE, AZUL = 0, 1, 2
combinar cor:
caso .VERMELLO:
print("Vexo vermello!")
caso .VERDE:
print("A herba é verde")
caso .BLU
E:
print("Sinto o blues :(")

Preparouse un conxunto para a súa revisión parches con experimental implementación especificación proposta, pero a versión final aínda está discutido. Por exemplo ofrécese En lugar da expresión "case _:" para o valor predeterminado, use a palabra clave "else:" ou "default:", xa que "_" noutros contextos úsase como variable temporal. Tamén é cuestionable a organización interna, que se basea en traducir novas expresións en bytecode semellante ao que se usa para os constructos “if... elif... else”, que non proporcionarán o rendemento desexado cando se procesan conxuntos moi grandes de comparacións.

Fonte: opennet.ru

Engadir un comentario