
Operador Walrus (:=) em Python
3 min read
O operador "Walrus" (:=), introduzido no Python 3.8, é uma ferramenta que nos ajuda a escrever código mais limpo, eficiente e legível (é…. mais ou menos, mais ou menos). Oficialmente chamado de "expressão de atribuição", ele permite que você atribua um valor a uma variável como parte de uma expressão maior.
Bora dar uma olhada!
O Que é o Operador Walrus e a problemática
Em essência, o operador walrus combina duas ações em uma: atribuir um valor a uma variável e retornar esse mesmo valor para ser usado imediatamente.
O Problema: Muitas vezes, precisamos obter um valor, checar se ele é válido e, se for, usá-lo. Isso geralmente resulta em código repetitivo ou menos legível.
A Solução (:=): Ele elimina essa redundância, tornando o código mais conciso e direto ao ponto.
Exemplos: Antes e Depois
Exemplo 1: Parsing de Saída de Comandos
Um dos usos mais comuns na automação de redes é executar um comando, procurar por um padrão com expressões regulares (regex) e, se encontrar, usar o valor encontrado.
Cenário: Encontrar todas as interfaces que estão administrativamente desativadas (administratively down) na saída de um show interface.
Sem o Operador Walrus 🙁
import re
# Simulação da saída de um comando
show_interface_output = """
GigabitEthernet1 is up, line protocol is up
GigabitEthernet2 is administratively down, line protocol is down
TenGigabitEthernet3/1 is up, line protocol is up
GigabitEthernet4 is administratively down, line protocol is down
"""
down_interfaces = []
for line in show_interface_output.splitlines():
# Procuramos pelo padrão
match = re.search(r"^(.*) is administratively down", line)
# Checamos se o padrão foi encontrado
if match:
# Se sim, usamos o valor capturado
interface_name = match.group(1)
down_interfaces.append(interface_name)
print(f"Interfaces desativadas: {down_interfaces}")
# Saída: Interfaces desativadas: [\"GigabitEthernet2\", \"GigabitEthernet4\"]
Com o Operador Walrus 🙂
import re
show_interface_output = """mesma do exemplo anterior"""
down_interfaces = []
for line in show_interface_output.splitlines():
# 1. Procuramos, atribuímos e checamos TUDO EM UMA LINHA
if match := re.search(r"^(.*) is administratively down", line):
# 2. Se o padrão foi encontrado, a variável \"match\" já está pronta para uso
down_interfaces.append(match.group(1))
print(f"Interfaces desativadas: {down_interfaces}")
# Saída: Interfaces desativadas: [\"GigabitEthernet2\", \"GigabitEthernet4\"]
A verificação e a atribuição acontecem no mesmo lugar, reduzindo a complexidade visual.
Exemplo 2: Loops Interativos (Cliente Ollama)
O operador walrus brilha em loops while onde você precisa obter uma entrada do usuário e verificar se ela atende a uma condição de saída.
Cenário: Criar um loop simples que lê a entrada do usuário, envia para uma função (simulando o cliente Ollama) e para quando o usuário digita "sair".
Sem o Operador Walrus 🙁
def processar_prompt(prompt):
print(f"🤖 Processando: {prompt}")
# Aqui iria a chamada real para o cliente Ollama
# client.chat(model="llama3", messages=[...])
# Precisamos ler a entrada uma vez fora do loop
prompt = input("Você: ")
# Checamos a condição
while prompt.lower() != "sair":
processar_prompt(prompt)
# 3. E precisamos ler a entrada novamente dentro do loop
prompt = input("Você: ")
print("Até logo!")
Com o Operador Walrus 🙂
def processar_prompt(prompt):
print(f"🤖 Processando: {prompt}")
# 1. Lemos, atribuímos e checamos TUDO NA CONDIÇÃO DO WHILE
while (prompt := input("Você: ")).lower() != "sair":
processar_prompt(prompt)
print("Até logo!")
Elimina a Duplicação: Não precisamos mais da linha
prompt = input("Você: ")em dois lugares diferentes.Lógica Centralizada: A lógica de controle do loop (obter entrada e verificar a condição de parada) está toda concentrada na declaração
while, tornando o código mais fácil de entender.
Quando Usar e Quando Evitar
Use o Operador Walrus (:=) | Evite o Operador Walrus (:=) |
Em condições if e while para evitar repetição. | Em expressões simples onde uma atribuição normal (=) é mais clara. |
| Quando o valor atribuído é usado imediatamente no mesmo contexto. | No nível superior de um módulo. Ele foi feito para ser usado dentro de expressões. |
Regra: Se o operador walrus torna seu código mais limpo e fácil de entender, use-o. Se ele o torna mais críptico, prefira a forma tradicional.
