Guido van Rossum borrador para revisión comunitaria 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 (, ), 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 . 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 .
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 con experimental especificación proposta, pero a versión final aínda está . Por exemplo 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
