# Direct or safe — you choose.
# reading from a dict — square brackets, get(), keys, values, items

soldier = {"name": "Raven", "score": 85, "active": True}

# ─────────────────────────────────────────────
# Square bracket lookup — direct
# ─────────────────────────────────────────────

print(soldier["name"])      # Raven
print(soldier["score"])     # 85
print(soldier["active"])    # True

# soldier["rank"]           # KeyError: 'rank' — key doesn't exist

# ─────────────────────────────────────────────
# get() — safe lookup
# ─────────────────────────────────────────────

print(soldier.get("name"))      # Raven
print(soldier.get("rank"))      # None  — no error

# get() with a default value
print(soldier.get("rank", "unassigned"))    # unassigned
print(soldier.get("score", 0))             # 85  — key exists, default ignored

# dict is not changed by get()
print(soldier)
# {'name': 'Raven', 'score': 85, 'active': True}

# ─────────────────────────────────────────────
# Check with in before square brackets
# ─────────────────────────────────────────────

if "rank" in soldier:
    print(soldier["rank"])
else:
    print("No rank assigned.")      # No rank assigned.

if "score" in soldier:
    print(soldier["score"])         # 85

# ─────────────────────────────────────────────
# keys(), values(), items()
# ─────────────────────────────────────────────

print(soldier.keys())
# dict_keys(['name', 'score', 'active'])

print(soldier.values())
# dict_values(['Raven', 85, True])

print(soldier.items())
# dict_items([('name', 'Raven'), ('score', 85), ('active', True)])

# convert to list if needed
print(list(soldier.keys()))        # ['name', 'score', 'active']
print(list(soldier.values()))      # ['Raven', 85, True]

# ─────────────────────────────────────────────
# Case sensitivity
# ─────────────────────────────────────────────

data = {"Name": "Raven", "name": "Wolf"}
print(data["Name"])     # Raven
print(data["name"])     # Wolf — different key

# ─────────────────────────────────────────────
# Quick reference
# ─────────────────────────────────────────────

# d["key"]                — direct lookup (KeyError if missing)
# d.get("key")            — safe lookup (None if missing)
# d.get("key", default)   — safe lookup with fallback
# "key" in d              — True if key exists
# d.keys()                — view of all keys
# d.values()              — view of all values
# d.items()               — view of all key-value pairs
#
# none of these modify the dict
# key lookup is case-sensitive
