O erroTypeError: O objeto ‘NoneType’ não é subscrito em Python significa que você tentou indexar ou fatiar algo que éNone — comoresult[0] quandoresult is None. É um dos erros mais comuns do Python. Aqui estão todas as causas e soluções.
📋 Table of Contents
- O que significa "Assinatura"
- Causa 1: a função não retorna nenhum implicitamente
- Causa 2: Método que modifica retornos no local Nenhum
- Causa 3: dict.get() Retornando Nenhum
- Causa 4: correspondência Regex retornando nenhum
- Causa 5: consulta de API/banco de dados retornando nenhum
- Depuração: Descubra por que não existe
- Padrões seguros para evitar isso
- Perguntas Frequentes
- Conclusão
O que significa “Assinatura”
Subscrever é acessar um elemento entre colchetes:x[0], x['key'], x[1:3]. Listas, dictos, strings e tuplas são subscritos. None não é — entãoNone[0] gera esse erro. A verdadeira questão é sempre:por que sua variável é nenhuma?
Causa 1: a função não retorna nenhum implicitamente
# 🐛 Function has no return statement (or a path that doesn't return)
def find_user(users, name):
for user in users:
if user['name'] == name:
return user
# No return when not found → returns None implicitly
result = find_user(users, "Alice")
print(result['email']) # ❌ TypeError if Alice not found (result is None)
# ✅ Check for None before subscripting
result = find_user(users, "Alice")
if result is not None:
print(result['email'])
else:
print("User not found")
Causa 2: Método que modifica retornos no local Nenhum
# 🐛 list.sort() sorts in place and returns None
numbers = [3, 1, 2]
sorted_nums = numbers.sort() # ❌ sort() returns None
print(sorted_nums[0]) # TypeError — sorted_nums is None
# ✅ Use sorted() which returns a new list
sorted_nums = sorted(numbers) # returns a new sorted list
print(sorted_nums[0]) # works
# Same trap with: list.append(), list.reverse(), dict.update()
# These modify in place and return None
Causa 3: dict.get() Retornando Nenhum
# 🐛 .get() returns None for missing keys
config = {"host": "localhost"}
port = config.get("port") # None — 'port' not in dict
print(port[0]) # ❌ TypeError
# ✅ Provide a default with .get()
port = config.get("port", 8080) # default if missing
# ✅ Or check before use
port = config.get("port")
if port is not None:
use(port)
Causa 4: correspondência Regex retornando nenhum
import re
# 🐛 re.match/search return None when no match
match = re.search(r'\d+', "no numbers here")
number = match.group() # ❌ TypeError — match is None
# ✅ Check the match first
match = re.search(r'\d+', text)
if match:
number = match.group()
else:
number = None
Causa 5: consulta de API/banco de dados retornando nenhum
# 🐛 Database query returns None when no row found
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
name = user['name'] # ❌ TypeError if no user found
# ✅ Always handle the "not found" case
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
if user is None:
raise NotFoundError(f"User {user_id} not found")
name = user['name'] # safe now
Depuração: Descubra por que não existe
# Add a check to see exactly what's None and where
result = some_function()
print(f"DEBUG: result = {result!r}, type = {type(result)}")
# If it prints "result = None", trace back to some_function()
# to find the code path that returns None
# Use a debugger to inspect
import pdb; pdb.set_trace() # step through and check the value
Padrões seguros para evitar isso
# Pattern 1: Walrus operator for check-and-use (Python 3.8+)
if (user := find_user(users, name)) is not None:
print(user['email'])
# Pattern 2: Provide defaults
data = fetch_data() or {} # empty dict if fetch returns None
value = data.get('key', 'default')
# Pattern 3: Optional chaining alternative (Python has no ?. operator)
name = user['name'] if user else None
# Pattern 4: Return consistent types from functions
def find_user(users, name):
for user in users:
if user['name'] == name:
return user
return {} # return empty dict instead of None (if that makes sense)
Perguntas Frequentes
P: Por que minha função está retornando None quando não escrevi “return None”?
R: As funções Python retornam None implicitamente se chegarem ao final sem uma instrução return ou atingirem um caminho de código que não retorna. Uma causa comum: um retorno dentro de um loop/se não for alcançado para todas as entradas.
P: Por que sorted_list = my_list.sort() fornece None?
A: .sort() classifica a lista no lugar e retorna Nenhum. Usarsorted(my_list) que retorna uma nova lista classificada. Essa armadilha se aplica a muitos métodos locais (anexar, reverter, atualizar).
P: Como faço para acessar com segurança chaves de dict aninhadas que podem estar faltando?
R: Corrente.get() com padrões:data.get('user', {}).get('name', 'unknown'). Cada .get() retorna um dict vazio se estiver ausente, para que a cadeia não atinja None.
P: Qual é a diferença entre isso e ‘NoneType não tem atributo’?
R: “Não subscrito” vem deNone[x] (colchetes). “Não tem atributo” é deNone.attr (acesso por ponto). Ambos significam que você tem um None onde esperava um objeto real – a correção (verifique None) é a mesma.
P: Devo usar verificações try/except ou if?
R: Prefira explícitoif x is not None verifica a clareza quando None é uma possibilidade esperada. Use try/except para casos verdadeiramente excepcionais. A verificação é mais clara e rápida para o cenário comum “pode ser Nenhum”.
Conclusão
“O objeto ‘NoneType’ não pode ser subscrito” significa que você está indexando algo que éNone. A verdadeira solução não é o subscrito – é a compreensãoporque sua variável é None: uma função retornando None implicitamente, um método local como.sort() que retorna None, uma chave de dict ausente, uma falha na correspondência de regex ou um resultado de consulta vazio. Adicione umprint(f"{result!r}") para confirmar o que é None, rastreie sua origem e proteja comif x is not None antes de assinar. Retornar tipos consistentes de suas funções evita totalmente a maioria desses erros.
🔗 Share this article
✍️ Leave a Comment