Structural Pattern Matching: a Estrutura match - Python
A partir da versão 3.10, o Python introduziu uma funcionalidade chamada structural pattern matching (correspondência de padrões estruturais). Essa funcionalidade envolve o uso da palavra-chave match
match
if
elif
else
match
A estrutura match tem a seguinte definição:
match expressão:
case padrão_1:
ação_1
case padrão_2:
ação_2
...
case padrão_N:
ação_N
case _:
ação_padrão
Após a palavra-chave match
case
case
match
A estrutura match
case
Como padrões, podem ser utilizados dados de tipos primitivos, bem como sequências de elementos e objetos de classes.
Vamos primeiro considerar uma situação em que os padrões são literais de tipos primitivos. Por exemplo, exibiremos uma mensagem de saudação dependendo do idioma:
def print_hello(language):
match language:
case "portuguese":
print("Olá")
case "english":
print("Hello")
case "german":
print("Hallo")
print_hello("english") # Hello
print_hello("german") # Hallo
print_hello("portuguese") # Olá
Aqui, a função print_hello
language
match
language
case
language
Por exemplo, ao chamar print_hello("english")
language
case "english":
print("Hello")
Observe que os blocos case
match
case
case
case
case
def print_hello(language):
match language:
case "portuguese": print("Olá")
case "english": print("Hello")
case "german": print("Hallo")
Se a expressão do match
case
case
Se for necessário executar ações padrão quando não houver correspondência (isto é, se nenhum dos padrões case
match
_
def print_hello(language):
match language:
case "portuguese": print("Olá")
case "english": print("Hello")
case "german": print("Hallo")
case _: print("Language not supported")
print_hello("english") # Hello
print_hello("spanish") # Undefined
Se nenhum dos padrões case
language
case _: print("Language not supported")
Também é possível definir um bloco case
|
def print_hello(language):
match language:
case "portuguese":
print("Olá")
case "american english" | "british english" | "english":
print("Hello")
case _:
print("Undefined")
print_hello("english") # Hello
print_hello("american english") # Hello
print_hello("spanish") # Undefined
Nesse caso, o padrão case "american english" | "british english" | "english"
Da mesma forma, é possível comparar expressões com dados de outros tipos. Por exemplo:
def operation(a, b, code):
match code:
case 1:
return a + b
case 2:
return a - b
case 3:
return a * b
case _:
return 0
print(operation(10, 5, 1)) # 15
print(operation(10, 5, 2)) # 5
print(operation(10, 5, 3)) # 50
print(operation(10, 5, 4)) # 0
Aqui, a função operation
code
case
case 1:
return a + b
Este bloco case retorna a soma dos números a
b
code = 2
code = 3
0