Artigo original: Truthy and Falsy Values in Python: A Detailed Introduction

Boas-vindas!

Neste artigo, você vai aprender:

  • O que são os valores truthy e falsy.
  • O que faz um valor truthy ou falsy.
  • Como usar a função bool() para determinar se um valor é truthy ou falsy.
  • Como tornar objetos de classes definidas por usuário como truthy ou falsy usando o método especial __bool __.

Vamos começar!

🔹 Valores true x Truthy e valores Falsy

Vou apresentar para você esses conceitos comparando-os com os valores True e False, que são tipicamente aqueles que mais usamos.

Expressões com operandos e operadores são avaliadas como True ou False e podem ser usadas em uma condição if ou while para determinar se um bloco de código deve ser executado.

Aqui vemos um exemplo:

# Expression 5 < 3
>>> if 5 < 3:
	print("True")
else:
	print("False")

# Output
False

Nesse exemplo, tudo funciona como esperado porque usamos uma expressão com dois operandos e um operador  5 < 3.

O que você acha que acontece, no entanto, se executarmos esse código?

>>> a = 5

>>> if a:
	print(a)

Perceba que agora não temos uma expressão típica perto da palavra chave if, temos apenas uma variável:

image-3

Surpreendentemente, o resultado é:

5

Se mudarmos o valor a para zero, dessa maneira:

>>> a = 0

>>> if a:
	print(a)

Não temos um resultado.

Certamente, você deve estar se perguntando nesse momento: O que fez o código ser executado com sucesso?

A variável a não é uma expressão típica. Ela não tem operadores e operandos. Então, por que ela resulta em True ou False dependendo do valor?

A resposta reside no conceito de valores Truthy e Falsy, que, por si só, não são valores verdadeiros ou falsos, mas, ainda assim, são avaliados como True ou False.

🔸Valores Truthy e Falsy

Em Python, valores individuais podem ser avaliados como True ou como False. Eles não precisam necessariamente fazer parte de uma expressão maior para serem avaliados como um valor verdadeiro, pois eles já têm um valor predeterminado pelas regras da linguagem Python.

As regras básicas são:

  • Valores avaliados como False são considerados Falsy.
  • Valores avaliados como True são considerados Truthy.

De acordo com a documentação do Python:

Qualquer objeto pode ser testado para o valor truthy, para o uso em condições if ou while ou como operando das operações com booleanos abaixo (and, or, not).

🔹 Contexto booleano

Quando usamos um valor como parte de uma expressão maior ou como uma condição if ou while, estamos usando esse valor dentro de um contexto booleano.

Você pode pensar no contexto booleano como uma "parte" do seu código que requer que um valor seja True ou False para fazer sentido.

Por exemplo, (veja abaixo) a condição depois da palavra-chave if ou depois da palavra-chave while tem que ser avaliada como True ou False:

image-1

💡 Dica: o valor pode ser armazenado em uma variável. Podemos escrever o nome da variável depois das palavras-chave if ou while ao invés do valor em si. Isso resultará na mesma funcionalidade.

Agora que você sabe o que são valores truthy e falsy e como eles funcionam em contexto booleano, vamos ver alguns exemplos reais de valores truthy e falsy.

🔸 Valores Falsy

Sequências e coleções:

  • Listas vazias []
  • Tuplas vazias ()
  • Dicionários vazios {}
  • Sets vazios set()
  • Strings vazias ""
  • Ranges vazios range(0)

Números

  • Zero de qualquer tipo numérico.
  • Inteiro: 0
  • De ponto flutuante: 0.0
  • Complexo: 0j

Constantes

  • None
  • False

Valores falsos foram a razão pela qual não houve saída em nosso exemplo inicial, quando o valor de a era zero.

O valor 0 é falsy. Portanto, a condição if será False e o condicional não será executado neste exemplo:

>>> a = 0
>>> if a:
	print(a)

# Sem resultado

🔹 Valores Truthy:

Segundo a documentação do Python:

Por padrão, um objeto é considerado verdadeiro.

Valores Truthy incluem:

  • Sequências ou coleções não vazias (listas, tuplas, strings, dicionários, sets).
  • Valores numéricos que não são zero.
  • True

Esse é o motivo pelo qual o valor de a foi impresso em nosso exemplo inicial, pois seu valor foi 5 (um valor truthy):

>>> a = 5

>>> if a:
	print(a)
    
 # Resultado
 5

🔸 A Função integrada bool()  

Você pode verificar se um valor é truthy ou falsy com a função integrada bool().

De acordo com a  documentação do Python, essa função:

Retorna um valor booleano, ou seja, True ou False. x (o argumento) é convertido usando o procedimento padrão de teste de verdade.
image-2

Você só precisa passar o valor como argumento, assim:

>>> bool(5)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool({5, 5})
True
>>> bool(-5)
True
>>> bool(0.0)
False
>>> bool(None)
False
>>> bool(1)
True
>>> bool(range(0))
False
>>> bool(set())
False
>>> bool({5, 6, 2, 5})
True

💡 Dica: você também pode passar uma variável como argumento para testar se seu valor é truthy ou falsy.

🔹 Exemplos reais

Uma das vantagens de usar valores truthy e falsy é que eles podem ajudá-lo a tornar seu código mais conciso e legível. Aqui temos dois exemplos reais.

Exemplo:
Temos a função print_even(), que recebe como argumento uma lista ou tupla que contém números e imprime apenas os valores que são pares. Se o argumento estiver vazio, ela imprime uma mensagem descritiva:

def print_even(data):
	if len(data) > 0:
		for value in data:
			if value % 2 == 0:
				print(value)
 	else:
 		print("O argumento não pode estar vazio")

Observe esta linha:

if len(data) > 0:

Podemos tornar a condição muito mais concisa com valores truthy e falsy:

if data:

Se a lista estiver vazia, data será avaliado como False. Se não estiver vazia, será avaliado como True. Obtemos a mesma funcionalidade com código mais conciso.

Esta seria a nossa função final:

def print_even(data):
	if data:
		for value in data:
			if value % 2 == 0:
				print(value)
 	else:
 		print("The argument cannot be empty")

Exemplo:
Também podemos usar valores truthy e falsy para gerar uma exceção (erro) quando o argumento passado para uma função não for válido.

>>> def print_even(data):

	if not data:
		raise ValueError("O argumento não pode estar vazio")

	for value in data:
		if value % 2 == 0:
			print(value)

Nesse caso, usando not data como condição da declaração if, obtemos o valor truthy oposto de data para a condição if.

Vamos analisar not data em mais detalhes:

Se data estiver vazio:

  • Será um valor falsy, então data será avaliado como False.
  • not data será equivalente à not False, que é True.
  • A condição será True.
  • A exceção será assinalada.

Se data não estiver vazio:

  • Será um valor truthy. Então, será avaliado como True.
  • not data será equivalente à not True, que é False .
  • A condição será False.
  • A excessão não será assinalada.

🔸 Transformando objetos personalizados em valores Truthy e Falsy

Se você estiver familiarizado com classes e Programação Orientada a Objetos, você pode adicionar um método especial às suas classes para fazer seus objetos agirem como valores truthy e falsy.

__bool __()

Com o método especial __bool__(), você pode definir uma condição "personalizada" que determinará quando um objeto de sua classe será avaliado como True ou False.

Segundo a documentação do Python:

Por padrão, um objeto é considerado verdadeiro, a menos que sua classe defina um método __bool__() que retorne False ou um método __len__() que retorne zero, quando chamado com o objeto.

Por exemplo, se tivermos esta classe muito simples:

>>> class Account:
	
	def __init__(self, balance):
		self.balance = balance

Você pode ver que nenhum método especial está definido. Então, todos os objeto dessa classes que você cria sempre serão avaliados como True:

>>> account1 = Account(500)
>>> bool(account1)
True
>>> account2 = Account(0)
>>> bool(account2)
True

Podemos personalizar esse comportamento adicionando o método especial __bool__():

>>> class Account:
	def __init__(self, balance):
		self.balance = balance
		
	def __bool__(self):
		return self.balance > 0

Agora, se o saldo da conta for maior que zero, o objeto será avaliado como True. Caso contrário, se o saldo da conta for zero, o objeto será avaliado como False.

>>> account1 = Account(500)
>>> bool(account1)
True
>>> account2 = Account(0)
>>> bool(account2)
False

💡 Dica: se __bool__() não estiver definido em uma classe, mas se o método  __len__() estiver, o valor retornado por esse método determinará se o objeto é truthy ou falsy.

🔹 Em resumo

  • Valores truthy são valores que são avaliados como True em um contexto booleano.
  • Valores falsy são valores que são avaliados como False em um contexto booleano.
  • Valores falsy incluem sequências vazias (listas, tuplas, strings, dicionários, sets), zero em qualquer tipo numérico, None e False.
  • valores truthy incluem sequências não vazias, números (exceto 0 em qualquer tipo numérico) e, basicamente, qualquer valor que não for falsy.
  • Eles podem ser usados para tornar seu código mais conciso.

Eu realmente espero que você tenha gostado do artigo e o achado útil. Agora, você pode trabalhar com valores truthy e falsy em seus projetos em Python. Veja os cursos on-line da autora e siga-a no Twitter. ⭐️