Guido van Rossum propôs adicionar operadores de correspondência de padrões ao Python

Guido van Rossum introduzido rascunho para revisão da comunidade especificações para implementar operadores de correspondência de padrões (match e case) em Python. Deve-se notar que propostas para adicionar operadores de correspondência de padrões já foram publicadas em 2001 e 2006 (pep-0275, pep-3103), mas foram rejeitados em favor da otimização da construção “if... elif... else” para compilar cadeias correspondentes.

A nova implementação é muito parecida com o operador “match” fornecido em Scala, Rust e F#, que compara o resultado de uma expressão especificada com uma lista de padrões listados em blocos baseados no operador “case”. Ao contrário do operador “switch” disponível em C, Java e JavaScript, as expressões baseadas em “match” oferecem muito mais ampla funcionalidade. Observa-se que os operadores propostos irão melhorar a legibilidade do código, simplificar a comparação de objetos Python arbitrários e a depuração, e também aumentar a confiabilidade do código graças à possibilidade de extensão verificação de tipo estático.

def http_error(status):
status da correspondência:
caso 400:
retornar "Solicitação incorreta"
caso 401|403|404:
retornar "Não permitido"
caso 418:
retorne "Eu sou um bule de chá"
caso _:
retornar "Outra coisa"

Por exemplo, você pode descompactar objetos, tuplas, listas e sequências arbitrárias para vincular variáveis ​​com base em valores existentes. É permitido definir modelos aninhados, usar condições “if” adicionais no modelo, usar máscaras (“[x, y, *rest]”), mapeamentos de chave/valor (por exemplo, {“largura de banda”: ​​b, “latência ”: l} para extrair valores e dicionário de "largura de banda" e "latência"), extrair submodelos (operador ":="), usar constantes nomeadas no modelo. Nas aulas, é possível personalizar o comportamento de correspondência usando o método “__match__()”.

de classes de dados importar classe de dados

@dataclass
ponto de classe:
x:int
você:int

def onde está (ponto):
ponto que decide o jogo:
caso Ponto (0, 0):
imprimir("Origem")
caso Ponto (0, y):
imprimir(f"S={y}")
ponto de caso (x, 0):
imprimir(f"X={x}")
ponto de caso():
print("Em outro lugar")
caso _:
print("Nem um ponto")

ponto que decide o jogo:
caso Ponto (x, y) se x == y:
imprimir(f"Y=X em {x}")
ponto de caso (x, y):
print(f"Não está na diagonal")

VERMELHO, VERDE, AZUL = 0, 1, 2
combinar cor:
caso .RED:
print("Vejo vermelho!")
caso .VERDE:
print("A grama é verde")
caso .BLU
E:
print(“Estou me sentindo triste :(“)

Um conjunto foi preparado para revisão manchas com experimental implementação especificação proposta, mas a versão final ainda está está sendo discutido. Por exemplo, proposto Em vez da expressão "case _:" para o valor padrão, use a palavra-chave "else:" ou "default:", pois "_" em outros contextos é usado como uma variável temporária. Também questionável é a organização interna, que se baseia na tradução de novas expressões em bytecode semelhante ao usado para construções “if... elif... else”, o que não fornecerá o desempenho desejado ao processar conjuntos muito grandes de comparações.

Fonte: opennet.ru

Adicionar um comentário