KeyError in Python — key not found in dictionary Fix (2026) | Tutorials Logic
What is KeyError?
A KeyError occurs in Python when you try to access a dictionary key that does not exist. Unlike some languages that return null for missing keys, Python raises an exception to alert you that the key was not found. This helps prevent silent bugs where missing data goes unnoticed.
KeyError: 'username'
Common Causes
Quick Fix (TL;DR)
# ❌ Problem
user = {"name": "Alice", "email": "alice@example.com"}
print(user["username"]) # KeyError: 'username'
# ✅ Solution 1: Use .get() with a default value
print(user.get("username", "N/A")) # "N/A"
# ✅ Solution 2: Check key existence first
if "username" in user:
print(user["username"])
Common Scenarios & Solutions
Scenario 1: Missing Dictionary Key
The most straightforward case — you try to access a key that was never added to the dictionary. Use .get() to safely retrieve values with a fallback default.
config = {"host": "localhost", "port": 5432}
db_name = config["database"] # KeyError: 'database'
config = {"host": "localhost", "port": 5432}
# ✅ Option 1: .get() with default
db_name = config.get("database", "mydb") # "mydb"
# ✅ Option 2: setdefault() — adds key if missing
config.setdefault("database", "mydb")
print(config["database"]) # "mydb"
# ✅ Option 3: Use defaultdict
from collections import defaultdict
config = defaultdict(str, {"host": "localhost"})
print(config["database"]) # "" (empty string default)
Scenario 2: Typo in Key Name
Dictionary keys are case-sensitive strings. "Username" and "username" are different keys. Always double-check the exact key names, especially when working with API responses or JSON data.
response = {"userId": 1, "userName": "Alice"}
print(response["user_id"]) # KeyError: 'user_id' (camelCase vs snake_case)
print(response["username"]) # KeyError: 'username' (wrong case)
response = {"userId": 1, "userName": "Alice"}
print(response["userId"]) # ✅ 1
print(response["userName"]) # ✅ "Alice"
# Debug: print all keys to see exact names
print(response.keys()) # dict_keys(['userId', 'userName'])
Scenario 3: Key Was Deleted
If a key is removed using del or dict.pop() and then accessed again, Python raises a KeyError. Use pop(key, default) to safely remove keys without raising an error.
session = {"user_id": 42, "token": "abc123"}
del session["token"]
print(session["token"]) # KeyError: 'token'
session = {"user_id": 42, "token": "abc123"}
# ✅ Safe removal with pop() and a default
token = session.pop("token", None)
# ✅ Check before accessing
if "token" in session:
print(session["token"])
else:
print("Token not found")
Scenario 4: Nested Dictionary Key Missing
When working with nested dictionaries (common with JSON API responses), accessing a nested key without checking parent keys first can raise a KeyError at any level of nesting.
data = {"user": {"name": "Alice"}}
city = data["user"]["address"]["city"] # KeyError: 'address'
data = {"user": {"name": "Alice"}}
# ✅ Chain .get() calls
city = data.get("user", {}).get("address", {}).get("city", "Unknown")
print(city) # "Unknown"
# ✅ Or use try/except for complex nesting
try:
city = data["user"]["address"]["city"]
except KeyError:
city = "Unknown"
Best Practices
Related Errors
- KeyError occurs when you access a dictionary key that does not exist.
-
Use
.get(key, default)instead of bracket notation for safe access. -
Dictionary keys are case-sensitive —
"Name"and"name"are different keys. -
Use
'key' in dictto check if a key exists before accessing it. -
Chain
.get()calls for safe nested dictionary access. -
collections.defaultdictautomatically handles missing keys with a default value.
Frequently Asked Questions
Level Up Your Python Skills
Master Python with these hand-picked resources