Skip to content

How to Fix KeyError in Python

DodaTech Updated 2026-06-15 2 min read

In this tutorial, you'll learn about How to Fix KeyError in Python. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Error message: KeyError: 'missing_key'

Python raises KeyError when you try to access a dictionary key that doesn't exist. It's the dict equivalent of IndexError for lists.

What Causes It

user = {"name": "Alice", "age": 30}
print(user["email"])  # KeyError: 'email'

The key "email" simply doesn't exist in the dictionary. This happens often with user input, API responses, or configuration data where some fields may be missing.

Fix 1: Use .get() with a Default

user = {"name": "Alice", "age": 30}

# Safe — returns None if key missing
email = user.get("email")
print(email)  # None

# With default value
email = user.get("email", "no-reply@example.com")
print(email)  # no-reply@example.com

Fix 2: Use defaultdict

from collections import defaultdict

# Regular dict — KeyError risk
scores = {}
scores["Alice"].append(95)  # KeyError!

# defaultdict — auto-creates missing keys
scores = defaultdict(list)
scores["Alice"].append(95)  # OK — creates list automatically
scores["Bob"].append(87)
print(dict(scores))  # {'Alice': [95], 'Bob': [87]}

This is especially useful when building nested data structures like lists of values grouped by key.

Fix 3: Use setdefault

setdefault() sets a value only if the key is missing, then returns it:

user = {"name": "Alice"}
role = user.setdefault("role", "viewer")
print(role)  # viewer
print(user)  # {'name': 'Alice', 'role': 'viewer'}

# Second call — key exists, returns existing value
role = user.setdefault("role", "admin")
print(role)  # viewer (unchanged)

Fix 4: Use try/except

user = {"name": "Alice", "age": 30}
try:
    email = user["email"]
except KeyError:
    email = "unknown@example.com"
    # Or log the error
    print("Email not found, using default")

Fix 5: Check First with in

user = {"name": "Alice", "age": 30}
if "email" in user:
    print(user["email"])
else:
    print("Email not provided")

This is the most readable approach when you need to branch on key existence.

Prevention

  • Use .get(key, default) for read access — it's the safest and shortest
  • Use defaultdict when building dictionaries of lists, sets, or counters
  • Validate API responses and user input with .get() before accessing nested keys
  • When iterating, use dict.items() to access keys safely
  • For nested dicts, chain .get() calls or use collections.ChainMap
  • Write unit tests that cover edge cases with missing keys
# Safe nested access
data = {"user": {"profile": {"email": "alice@example.com"}}
email = data.get("user", {}).get("profile", {}).get("email")
print(email)  # alice@example.com — no KeyError even if intermediate is missing

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro