Pular para o conteúdo

Como usar o operador walrus de forma simplificada

CodeMDD.io

O Operador do Walrus: Expressões de Atribuição no Python 3.8

por Geir Arne Hjelle

Cada nova versão do Python adiciona novos recursos à linguagem. Para o Python 3.8, a maior mudança é a adição das expressões de atribuição. Especificamente, o operador := fornece uma nova sintaxe para atribuir variáveis no meio de expressões. Esse operador é conhecido coloquialmente como o operador do walrus.

Este tutorial é uma introdução detalhada ao operador do walrus. Você aprenderá algumas das motivações para a atualização da sintaxe e explorará alguns exemplos onde as expressões de atribuição podem ser úteis.

Neste tutorial, você aprenderá como:

  • Identificar o operador do walrus e entender seu significado
  • Entender os casos de uso para o operador do walrus
  • Evitar código repetitivo usando o operador do walrus
  • Converter entre código que utiliza o operador do walrus e código que utiliza outros métodos de atribuição
  • Entender os impactos na compatibilidade retroativa ao utilizar o operador do walrus
  • Usar o estilo apropriado em suas expressões de atribuição

Observe que todos os exemplos do operador do walrus neste tutorial requerem o Python 3.8 ou posterior para funcionar.

Fundamentos do Operador do Walrus

Vamos começar com alguns termos diferentes que os programadores usam para se referir a essa nova sintaxe. Você já viu alguns deles neste tutorial.

O operador := é oficialmente conhecido como o operador de expressão de atribuição. Durante discussões iniciais, ele recebeu o apelido de operador do walrus porque a sintaxe := se parece com os olhos e presas de um morsa virada de lado. Você também pode ver o operador := sendo referido como o operador de dois pontos igual. Outro termo usado para expressões de atribuição é expressões nomeadas.

Olá, Walrus!

Para ter uma primeira impressão do que as expressões de atribuição são, inicie seu REPL e brinque com o seguinte código:

>>> walrus = False
>>> walrus
False
>>> (walrus := True)
True
>>> walrus
True

A linha 1 mostra uma declaração de atribuição tradicional em que o valor False é atribuído à variável walrus. Em seguida, na linha 5, você usa uma expressão de atribuição para atribuir o valor True à variável walrus. Após as linhas 1 e 5, você pode se referir aos valores atribuídos usando o nome da variável walrus.

Você pode estar se perguntando por que está usando parênteses na linha 5, e você aprenderá por que os parênteses são necessários mais adiante neste tutorial.

Observação: Uma declaração no Python é uma unidade de código. Uma expressão é uma declaração especial que pode ser avaliada para algum valor.

Por exemplo, 1 + 2 é uma expressão que avalia para o valor 3, enquanto number = 1 + 2 é uma declaração de atribuição que não avalia para um valor.

Embora o código acima demonstre o básico do operador do walrus, há muito mais para aprender sobre ele. Vamos explorar os fundamentos desse operador e discutir seus casos de uso, syntax e possíveis armadilhas.

Casos de Uso do Operador do Walrus

Depuração

O operador do walrus pode ser muito útil durante a depuração de código. Com ele, você pode atribuir um valor a uma variável no meio de uma expressão e, ao mesmo tempo, avaliar a expressão em si. Isso pode ser útil para verificar o valor de uma variável enquanto a expressão está sendo avaliada.

Aqui está um exemplo para ilustrar esse caso de uso:

while (line := input("Digite algo: ")) != "sair":
print("Você digitou:", line)

Nesse exemplo, o operador do walrus é usado para atribuir o valor de input("Digite algo: ") à variável line enquanto também é feita a comparação com a string "sair". O loop while continuará sendo executado enquanto o valor digitado pelo usuário for diferente de “sair”. A cada iteração do loop, o valor digitado pelo usuário é impresso na tela.

Listas e Dicionários

O operador do walrus também pode ser usado para simplificar a manipulação de listas e dicionários em algumas situações. Vamos ver um exemplo com uma lista:

numbers = [1, 2, 3, 4, 5]
index = -1
while (index := index + 1) < len(numbers):
print("O número", numbers[index], "está no índice", index)

Nesse exemplo, o operador do walrus é utilizado para atualizar o valor de index a cada iteração do loop while. A cada iteração, o valor do índice é incrementado e utilizado como índice para acessar o número correspondente na lista numbers. O número e o índice são então impressos na tela.

List Comprehensions

As expressões de atribuição também podem ser usadas em list comprehensions para simplificar o código. Vamos ver um exemplo:

numbers = [1, 2, 3, 4, 5]
squared_numbers = [square := number ** 2 for number in numbers]

Nesse exemplo, o operador do walrus é utilizado para atribuir o valor de number ** 2 à variável square enquanto a lista comprehension itera sobre os números da lista numbers. O resultado é uma nova lista contendo os números da lista numbers elevados ao quadrado.

Loops While

Outro caso de uso comum para o operador do walrus é simplificar loops while que dependem de uma expressão booleana. Vamos ver um exemplo:

import random
number = None
while (number := random.randint(1, 10)) != 7:
print("Número sorteado:", number)
print("Número 7 sorteado!")

Nesse exemplo, o operador do walrus é utilizado para atribuir um número aleatório entre 1 e 10 à variável number enquanto o número sorteado for diferente de 7. O loop while continuará sendo executado até que o número 7 seja sorteado. Quando isso acontecer, a mensagem “Número 7 sorteado!” será impressa na tela.

Testemunhas e Contraexemplos

O operador do walrus também pode ser usado para simplificar a declaração de variáveis em casos complexos, em que vários testes ou verificações são necessários dentro de uma expressão. Vamos ver um exemplo:

print("Texto corrigido:", text)
else:
print("Texto não corresponde ao esperado:", text)

Sintaxe do Operador do Walrus

Para utilizar o operador do walrus corretamente, é importante entender sua sintaxe. O operador do walrus é representado pelo símbolo := e pode ser utilizado em várias situações.

Aqui estão alguns exemplos de como utilizar o operador do walrus:

# Exemplo 1: Atribuição dentro de uma expressão condicional
if (name := input("Digite seu nome: ")) == "Alice":
print("Olá, Alice!")
# Exemplo 2: Atribuição dentro de um loop while
while (guess := int(input("Digite um número: "))) != 42:
print("Você não acertou o número 42.")
# Exemplo 3: Atribuição dentro de uma list comprehension
numbers = [1, 2, 3, 4, 5]
squared_numbers = [square := number ** 2 for number in numbers]
# Exemplo 4: Atribuição dentro de uma expressão de comparação
age = 18
is_adult = (age := int(input("Digite sua idade: "))) >= 18

Observe que, em cada exemplo, o operador do walrus é utilizado para atribuir um valor a uma variável e, ao mesmo tempo, utilizar esse valor em uma expressão.

Possíveis Armadilhas do Operador do Walrus

Embora o operador do walrus seja uma adição empolgante ao Python, é importante estar ciente de algumas armadilhas potenciais ao utilizá-lo.

Possíveis Efeitos Colaterais

Quando você utiliza o operador do walrus, tenha cuidado para não introduzir efeitos colaterais indesejados em seu código. Como o operador do walrus realiza uma atribuição no meio de uma expressão, isso pode levar a resultados inesperados se você não tiver cuidado.

Por exemplo:

number = 5
while (number := number - 1) > 0:
print(number)

Nesse exemplo, o operador do walrus é utilizado para atualizar o valor de number a cada iteração do loop while. No entanto, como a expressão (number := number - 1) é avaliada antes da comparação com 0, o número 0 também é impresso na tela. Isso pode ser um resultado indesejado.

Legibilidade e Manutenção do Código

Embora o operador do walrus possa ser útil em certas situações, seu uso excessivo pode tornar o código menos legível e mais difícil de manter. O operador do walrus pode criar linhas de código longas e complexas, o que pode dificultar a compreensão do código por outras pessoas e até mesmo por você mesmo no futuro.

Portanto, é importante encontrar um equilíbrio entre a simplicidade e a utilização adequada do operador do walrus em seu código.

Conclusão

O operador do walrus é uma adição poderosa ao Python 3.8 e oferece uma nova sintaxe para atribuir variáveis no meio de expressões. Ele pode ser usado para simplificar e tornar o código mais legível em várias situações. No entanto, é importante utilizar o operador do walrus com cuidado e considerar os possíveis efeitos colaterais e impactos na legibilidade do código.

Espero que este tutorial tenha fornecido uma introdução clara e útil ao operador do walrus e suas aplicações. Agora você deve se sentir mais confortável com essa nova adição ao Python e capaz de utilizá-la de forma eficaz em seus próprios projetos. Divirta-se codificando!