Pular para o conteúdo

Como utilizar o operador walrus do Python?

[

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

O Python, a cada nova versão, 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 := oferece uma nova sintaxe para atribuir valores a variáveis no meio de expressões. Esse operador é conhecido coloquialmente como o operador walrus.

Este tutorial é uma introdução detalhada ao operador walrus. Você aprenderá algumas das motivações por trás da atualização de sintaxe e explorará alguns exemplos de situações em que as expressões de atribuição podem ser úteis.

Neste tutorial, você vai aprender como:

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

Vale ressaltar que todos os exemplos usando o operador walrus neste tutorial requerem o Python 3.8 ou uma versão posterior para funcionar.

Fundamentos do Operador 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 operador de expressão de atribuição. Durante as primeiras discussões, ele recebeu o apelido de operador walrus porque a sintaxe := se assemelha aos olhos e presas de um morsa virado de lado. Você também pode ver o operador := referido como operador igual dois pontos. Outro termo usado para as 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, comece seu interpretador interativo (REPL) e brinque com o seguinte código:

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

A linha 1 mostra um exemplo de declaração de atribuição tradicional, onde 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. Depois das 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á o motivo deles serem necessários mais adiante neste tutorial.

Observação: Uma declaração em 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.

Casos de Uso do Operador Walrus

Agora que você conhece a sintaxe básica do operador walrus, vamos explorar alguns casos de uso em que essas expressões de atribuição podem ser úteis.

Depuração

Uma aplicação comum das expressões de atribuição é durante depuração, quando você deseja exibir o valor de uma variável e, ao mesmo tempo, realizar uma tarefa específica.

Suponha que você esteja depurando um trecho de código onde a variável number é importante. Você pode usar uma expressão de atribuição para exibir o valor atual de number e também realizar uma operação em uma única linha:

if number := get_number():
print(f"The number is {number}")

Neste exemplo, a função get_number() retorna um valor a ser atribuído à variável number, e a expressão number := get_number() retorna o valor atribuído à variável, que é avaliado como um valor booleano. Se o valor for True, a mensagem será impressa.

Essa forma compacta de escrever código pode ser útil quando você precisa investigar o valor de uma variável em um contexto específico enquanto executa outras ações.

Listas e Dicionários

Outra aplicação comum do operador walrus é ao trabalhar com listas e dicionários. Em alguns casos, você pode precisar verificar se um determinado item está presente na lista antes de realizar uma ação. Com o operador walrus, você pode realizar essa verificação e, ao mesmo tempo, acessar e utilizar o item a ser verificado.

Suponha que você tenha uma lista de números e deseja verificar se um determinado número está nessa lista antes de realizar alguma tarefa com ele. Você pode utilizar uma expressão de atribuição para fazer essa verificação e, ao mesmo tempo, acessar o item caso ele esteja presente:

numbers = [1, 2, 3, 4, 5]
if (index := numbers.index(3)) != -1:
print(f"The number 3 is at index {index}")

Neste exemplo, você utiliza a expressão de atribuição (index := numbers.index(3)) para atribuir o índice do número 3 na lista à variável index. Em seguida, você verifica se o valor atribuído é diferente de -1, que é o valor retornado pelo método index() caso o número não esteja na lista. Se o número estiver na lista, a mensagem será impressa.

Essa forma de escrita elimina a necessidade de executar o método index() duas vezes e melhora a legibilidade do código, pois todas as ações são realizadas em uma única linha.

Compreensões de Lista

O operador walrus também pode ser útil ao trabalhar com compreensões de lista. Comprensões de lista são uma forma concisa de criar novas listas a partir de uma lista existente, aplicando uma expressão ou uma série de transformações aos seus elementos.

Suponha que você tenha uma lista de números e queira criar uma nova lista contendo apenas os números pares dessa lista. Com o operador walrus, você pode fazer essa filtragem e, ao mesmo tempo, adicionar ações adicionais usando compreensões de lista:

numbers = [1, 2, 3, 4, 5]
even_numbers = [number for number in numbers if (number % 2 == 0)]

Neste exemplo, você utiliza a expressão de atribuição (number := number for number in numbers) para atribuir cada número da lista à variável number. Em seguida, você verifica se o número é par usando a expressão (number % 2 == 0). Apenas os números que atenderem a essa condição serão adicionados à nova lista even_numbers.

Essa forma de escrita permite combinar o processo de filtragem dos elementos da lista com a atribuição dos mesmos à variável temporária number em uma única linha de código.

Laços While

O operador walrus também pode ser utilizado em laços de repetição do tipo while para verificar continuamente uma condição enquanto realiza outras ações.

Suponha que você queira ler números do usuário até que um número negativo seja digitado. Com o operador walrus, você pode manter um laço while ativo até que o número seja negativo e, ao mesmo tempo, atribuir o valor digitado à variável user_input:

user_input = 0
while (user_input := int(input("Enter a number: "))) >= 0:
print(f"You entered: {user_input}")

Neste exemplo, a expressão de atribuição (user_input := int(input("Enter a number: "))) é utilizada para atribuir o valor digitado pelo usuário à variável user_input ao mesmo tempo em que verifica se o número digitado é maior ou igual a zero. O laço while continua executando enquanto a condição for verdadeira, ou seja, enquanto o número for maior ou igual a zero.

Essa forma de escrita permite verificar continuamente a condição de um laço while e realizar outras ações, como exibir mensagens ao usuário, em uma única linha de código.

Testemunhas e Contraditórios

O operador walrus também pode ser utilizado para tratar de casos em que você precisa de uma variável intermediária para armazenar o resultado de uma expressão de teste.

Suponha que você queira testar se uma string é um palíndromo e também armazenar o resultado do teste para uso posterior. Você pode utilizar o operador walrus para atribuir esse resultado a uma variável, facilitando sua utilização no resto do código:

word = "radar"
if (is_palindrome := word == word[::-1]):
print(f"The word '{word}' is a palindrome")

Neste exemplo, a expressão de atribuição (is_palindrome := word == word[::-1]) é utilizada para atribuir o resultado do teste de palíndromo à variável is_palindrome. Em seguida, você verifica se o resultado é True e, se for, imprime uma mensagem.

Essa forma de escrita permite atribuir o resultado de um teste ou de uma expressão a uma variável específica e simplifica o código, tornando mais fácil entender o que está sendo feito.

Sintaxe do Operador Walrus

Agora que você conheceu algumas situações em que o operador walrus pode ser útil, vamos falar um pouco mais sobre a sua sintaxe.

A sintaxe básica do operador walrus é (variável := expressão).

  • variável é o nome da variável à qual você deseja atribuir um valor.
  • expressão é uma expressão válida que retorna um valor.

Entre os usos do operador walrus que vimos até agora, a sintaxe ficou entre parênteses para evitar ambiguidades na gramática do Python. No entanto, em alguns contextos, você pode usar o operador walrus sem os parênteses quando a expressão contiver operadores aritméticos ou lógicos:

if walrus := 5 > 3 and 2 < 4:
print("Walrus is true")

Neste exemplo, você utiliza a expressão de atribuição walrus := 5 > 3 and 2 < 4 como a condição do if. Se a expressão for avaliada como True, a mensagem será impressa. A omissão dos parênteses torna o código mais conciso quando você está trabalhando com expressões simples.

Armadilhas do Operador Walrus

Embora o operador walrus seja uma adição poderosa ao Python 3.8, é preciso ter cuidado ao utilizá-lo. Existem algumas armadilhas que você deve conhecer ao utilizar esse operador.

A primeira armadilha está relacionada à legibilidade do código. Embora o operador walrus permita escrever código mais conciso ao atribuir valores a variáveis no meio de expressões, o uso excessivo ou desnecessário desse operador pode tornar o código difícil de ler e entender. É importante encontrar um equilíbrio entre concisão e legibilidade ao utilizar o operador walrus.

A segunda armadilha está relacionada à compatibilidade com versões anteriores. O operador walrus foi introduzido no Python 3.8 e, portanto, não existia em versões anteriores do Python. Se você precisa garantir que seu código seja executado em versões mais antigas do Python, não deve usar o operador walrus. Nesse caso, você pode converter seu código para uma sintaxe mais antiga que atenda aos requisitos das versões anteriores.

Por fim, a terceira armadilha está relacionada à ordem de avaliação das expressões. Quando você usa o operador walrus no meio de expressões, é importante lembrar que o valor atribuído à variável com o operador walrus é considerado como um resultado da expressão. Isso significa que a ordem de avaliação das expressões pode ser alterada, o que pode levar a resultados inesperados ou indesejados. É importante estar ciente dessa ordem de avaliação ao utilizar o operador walrus em expressões complexas.

Conclusão

O operador walrus é uma nova sintaxe introduzida no Python 3.8 que permite atribuir valores a variáveis no meio de expressões. Essa adição traz benefícios em termos de concisão e legibilidade do código.

Neste tutorial, você aprendeu alguns dos casos de uso do operador walrus e viu exemplos de como ele pode ser utilizado em diferentes situações. Você também aprendeu sobre a sintaxe do operador walrus e algumas armadilhas a serem evitadas ao utilizá-lo.

Lembre-se de que o operador walrus requer o Python 3.8 ou uma versão posterior para funcionar corretamente. Além disso, é importante avaliar a legibilidade do código ao utilizar o operador walrus e estar ciente das armadilhas relacionadas à compatibilidade com versões anteriores e à ordem de avaliação das expressões.

O operador walrus é mais uma ferramenta poderosa à disposição dos desenvolvedores Python e pode ajudar a tornar o código mais conciso e eficiente em certas situações. Experimente utilizar o operador walrus em seu próximo projeto e veja como ele pode facilitar suas tarefas de programação.