Python O Valor None
Às vezes um programa precisa dizer "aqui não tem nada": o cliente não deixou telefone, a promoção ainda não tem desconto definido, a busca não achou ninguém. Para isso, o Python tem um valor especial, o None (em inglês, "nenhum"). Ele não é zero, não é um texto vazio, não é falso: é a ausência de valor. Nesta aula você vai ver como usá-lo, como perguntar se uma variável está "vazia" desse jeito e por que tanta mensagem de erro fala em NoneType.
- O que é o
Nonee qual é o tipo dele, oNoneType. - Quando usar
None: o valor que "ainda não existe" ou "não foi informado". - Por que
Nonenão é0, nem"", nemFalse. - A perguntar "é
None?" comis None. - Por que o modo interativo não mostra nada quando o resultado é
None. - Onde o
Noneaparece sem você pedir: oprint()devolveNone. - Os erros reais com
NoneType, os mais comuns do Python.
Os programas desta aula rodaram no Python 3.14 da máquina da Ana (usuária ana, computador notebook), e podem ser repetidos no editor do guia.
A ideia: o campo em branco da ficha
A padaria guarda uma ficha de cada cliente que encomenda bolo. Na ficha da Dona Lúcia, o campo "Telefone" ficou em branco: ela não quis informar. Repare: em branco não é "telefone zero" nem "telefone falso". É "sem telefone", uma informação que não existe.
Na ficha de papel, você deixa o espaço vazio. No Python, você escreve None:
| Valor | O que diz | Na ficha |
|---|---|---|
0 | Um número: zero | "Encomendou 0 bolos" |
"" | Um texto, só que vazio | "Apelido: (escreveu nada)" |
False | Uma resposta: não | "Cliente VIP? Não" |
None | Nenhum valor | "Telefone: (sem informação)" |
1. Escrevendo None
nome = "Dona Lúcia" telefone = None print(nome) print(telefone) print(type(telefone))
$ python3 ficha.py Dona Lúcia None <class 'NoneType'>
- telefone = None
- A variável existe, mas guarda "nada". Assim o programa registra que o telefone não foi informado.
- None
- Com N maiúsculo e sem aspas, como
TrueeFalse. É uma palavra reservada do Python. - print(telefone) → None
- O
printmostra a palavraNonepara você saber que ali não há valor. - <class 'NoneType'>
- O tipo do
Nonese chamaNoneType("tipo do nenhum"). É um tipo com um valor só: o próprioNone. Você vai ver esse nome em muitas mensagens de erro.
O modo interativo não mostra o None
No modo interativo (aula O Modo Interativo), o Python mostra o resultado de tudo o que você digita, menos quando o resultado é None:
$ python3 -q >>> None >>> print(None) None >>> telefone = None >>> telefone >>> type(None) <class 'NoneType'>
Digitar None ou telefone não mostrou nada: para o modo interativo, "nada" não precisa ser mostrado. Para ver, peça com print(). Se um dia você digitar algo no >>> e não aparecer resposta nenhuma, o resultado provavelmente foi None.
2. None não é zero, nem vazio, nem falso
O None é diferente de todos os outros valores "pequenos":
$ python3 -q >>> None == 0 False >>> None == "" False >>> None == False False >>> bool(None) False
As três primeiras perguntas mostram que None não é igual a 0, nem a "", nem a False. Mas a última mostra que, quando o Python precisa de um "sim ou não", o None conta como falso: ele é falsy, como o zero e o texto vazio (aula Booleanos).
Por que a diferença importa? Pense no desconto da padaria. "Desconto 0" quer dizer "o desconto foi decidido e é zero". "Desconto None" quer dizer "ninguém decidiu o desconto ainda". São situações diferentes, e o programa pode precisar tratá-las de jeitos diferentes.
3. Perguntando "é None?": is None
Para saber se uma variável guarda None, o costume do Python é usar is None ("é nenhum"):
desconto = None print(desconto is None) desconto = 0 print(desconto is None) print(desconto == 0)
$ python3 desconto.py True False True
- desconto is None
- "O desconto é o
None?" Na primeira vez, sim:True. - desconto = 0
- Agora alguém decidiu: o desconto é zero.
- desconto is None → False
- Zero não é
None. - desconto == 0 → True
- Mas é igual a zero.
O contrário é is not None ("não é nenhum"): telefone is not None responde True quando o telefone foi informado. O is tem aula própria, is e in, que explica por que ele é o certo para o None e o == é o certo para o resto.
| Forma | Quando usar |
|---|---|
telefone is None | Sempre que a pergunta for "é None?". É a forma recomendada pelo guia de estilo do Python (aula PEP 8) |
telefone is not None | "Tem valor?" |
telefone == None | Funciona quase sempre, mas não é o costume. Evite |
not telefone | Cuidado: dá True para None, mas também para 0 e "". Use só quando você quer tratar todos os "vazios" do mesmo jeito |
Missão: a ficha do Seu Joaquim está sem telefone, mas o programa para com NameError. Conserte o valor que quer dizer "nada".
telefone = none
print("Telefone:", telefone)
telefone = None
print("Telefone:", telefone)
4. Onde o None aparece sem você pedir
Toda função do Python devolve alguma coisa. As que fazem um trabalho e não têm nada para devolver, como o print(), devolvem None. O print mostra o texto na tela, mas não entrega nada de volta:
resultado = print("Bom dia!")
print(resultado)
$ python3 retorno_print.py Bom dia! None
A linha 1 mostrou "Bom dia!" e guardou na variável o que o print devolveu: None. Parece bobagem, mas é a origem de um erro muito comum. A Ana queria calcular o preço de 2 pães de queijo e somar a taxa de entrega:
preco = 4.5
total = print(preco * 2)
print("Total com taxa:", total + 1)
$ python3 total_print.py
9.0
Traceback (most recent call last):
File "/home/ana/total_print.py", line 3, in <module>
print("Total com taxa:", total + 1)
~~~~~~^~~
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
O 9.0 apareceu (o print mostrou a conta), mas o total ficou com None, e somar None + 1 não existe. O conserto é guardar a conta, e não o print:
preco = 4.5
total = preco * 2
print(total)
print("Total com taxa:", total + 1)
$ python3 total_certo.py 9.0 Total com taxa: 10.0
Quando você criar as suas próprias funções (aula return), vai ver que uma função sem return também devolve None.
5. Para que usar None
| Situação | Exemplo |
|---|---|
| Informação que não foi dada | telefone = None |
| Valor que ainda vai ser calculado ou decidido | desconto = None, maior_nota = None |
| "Não encontrei" | Uma busca que devolve None quando não acha (você vai ver isso em Dicionários, com o .get()) |
| Função que só faz um trabalho | print() devolve None |
Quando dá errado
Os erros com NoneType estão entre os mais comuns do Python. Quase sempre a causa é a mesma: uma variável que você achava que tinha um valor tem None. Quando aparecer NoneType numa mensagem, pergunte: "de onde veio esse None?".
None: TypeError: unsupported operand type(s)
telefone = None print(telefone + 1)
$ python3 none_mais.py
Traceback (most recent call last):
File "/home/ana/none_mais.py", line 2, in <module>
print(telefone + 1)
~~~~~~~~~^~~
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
- line 2
- O erro está na linha 2.
- ~~~~~~~~~^~~
- Os tils marcam os dois lados da conta, e o chapeuzinho, o
+. - TypeError
- "Erro de tipo".
- unsupported operand type(s) for +
- "Tipos de operando não suportados para
+": o+não sabe trabalhar com esses tipos. - 'NoneType' and 'int'
- Do lado esquerdo havia um
NoneType(oNone) e, do lado direito, umint(o 1).
Como consertar: descubra por que a variável tinha None. Foi guardado o resultado de um print? Faltou dar o valor? Se o None é esperado (telefone não informado), pergunte com is None antes de usar.
None como texto: TypeError e AttributeError
apelido = None print(len(apelido))
$ python3 none_len.py
Traceback (most recent call last):
File "/home/ana/none_len.py", line 2, in <module>
print(len(apelido))
~~~^^^^^^^^^
TypeError: object of type 'NoneType' has no len()
"Objeto do tipo NoneType não tem len()". O len() conta as letras de um texto (aula Strings), mas o None não tem letras para contar. O mesmo acontece ao chamar um método de texto:
apelido = None print(apelido.upper())
$ python3 none_upper.py
Traceback (most recent call last):
File "/home/ana/none_upper.py", line 2, in <module>
print(apelido.upper())
^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'upper'
AttributeError é "erro de atributo": "objeto NoneType não tem o atributo upper". O .upper() deixa um texto em maiúsculas, e o None não é texto. Como consertar: se o apelido pode faltar, guarde "" (texto vazio, que tem len 0 e aceita .upper()) ou confira com is None antes.
none com minúscula: NameError
telefone = none
print("Telefone:", telefone)
$ python3 none_minusculo.py
Traceback (most recent call last):
File "/home/ana/none_minusculo.py", line 1, in <module>
telefone = none
^^^^
NameError: name 'none' is not defined. Did you mean: 'None'?
Como com o true da aula Booleanos: none, com minúscula, parece o nome de uma variável que não existe, e o Python sugere 'None'. Quem vem de outras linguagens costuma escrever null ou nil, e o resultado é o mesmo NameError. Como consertar: None, com N maiúsculo.
"None" entre aspas
Com aspas, "None" é um texto de quatro letras, e não o "nada". O print mostra os dois do mesmo jeito, mas "None" is None é False. (No modo interativo, o Python ainda avisa: SyntaxWarning: "is" with 'str' literal. Did you mean "=="?, porque usar is com um texto escrito no código quase sempre é engano.) Como consertar: None, sem aspas.
Referência rápida
| Escrita | Resultado | Observação |
|---|---|---|
x = None | x sem valor | N maiúsculo, sem aspas |
type(None) | <class 'NoneType'> | O tipo que só tem o None |
x is None | True ou False | A forma certa de perguntar |
x is not None | True ou False | "Tem valor?" |
None == 0, None == "", None == False | False | None não é nenhum deles |
bool(None) | False | None é falsy |
print(…) | devolve None | Mostra, mas não entrega valor |
| Sintoma | Causa provável |
|---|---|
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' | Conta com uma variável que tinha None (muitas vezes, o resultado de um print) |
TypeError: object of type 'NoneType' has no len() | len() de uma variável com None |
AttributeError: 'NoneType' object has no attribute '…' | Método chamado numa variável com None |
NameError: name 'none' is not defined. Did you mean: 'None'? | none, null ou nil: o certo é None |
No >>>, nenhuma resposta | O resultado foi None: use print() para ver |
Exercícios
1. O tipo do nada
Complete o que print(type(None)) mostra:
2. A pergunta certa
Complete para perguntar se o desconto ainda não foi definido:
3. Quanto vale None == 0?
4. O que x = print("Oi") guarda em x?
5. Apareceu AttributeError: 'NoneType' object has no attribute 'upper'. O que isso quer dizer?
Missão final: o total que sumiu
Missão: o programa mostra 9.0 e depois para com TypeError, porque a variável total ficou com None. Faça o total guardar a conta, para a última linha mostrar Total com taxa: 10.0.
preco = 4.5
total = print(preco * 2)
print("Total com taxa:", total + 1)
preco = 4.5
total = preco * 2
print("Total com taxa:", total + 1)
Resumo
Noneé o valor que quer dizer "nada", "sem valor", "não informado". Escreve-se com N maiúsculo e sem aspas.- O tipo dele é
NoneType, que só tem esse valor. Nonenão é0, nem"", nemFalse, mas é falsy:bool(None)éFalse.- Para perguntar, use
x is Noneex is not None. - O modo interativo não mostra resultados
None; useprint(). - O
print()devolveNone: guarde a conta, não oprint. - Erros com
NoneTypequerem dizer que uma variável tinhaNonequando você esperava um valor. Procure de onde ele veio.