Skip to content
Sarj Code Standards

prefer-typed-mapping-get

Read named fields from typed records instead of schema-free mappings.

Why

A get call on an Any/object-valued mapping or unchecked decoded JSON does not declare the field's type or distinguish a misspelled field from missing data. A default can conceal that gap.

Fix

Validate external data into a named Pydantic model before reading its attributes. For trusted internal records, declare a TypedDict or another precise record. Preserve legitimate get calls on typed mappings, optional TypedDict fields and validated normalization callbacks.

Examples

Before — flagged Imported parsing helpers keep their raw mapping contract
app/__init__.py
# package
app/parser.py
import json
def parse(text: str) -> dict[str, object]:
return json.loads(text)
app/state.py
from .parser import parse
def name(text: str):
return parse(text).get("name")
After — preferred An imported parser validates a named model
app/__init__.py
# package
app/parser.py
from pydantic import BaseModel
class State(BaseModel):
labels: dict[str, str]
def parse(text: str) -> State:
return State.model_validate_json(text)
app/state.py
from .parser import parse
def name(text: str):
return parse(text).labels.get("name")
Before — flagged The field has no declared type
app/state.py
def service_name(state: dict[str, object]):
return state.get("name")
After — preferred TypedDict retains the field contract
app/state.py
from typing import TypedDict
class State(TypedDict):
name: str
def service_name(state: State) -> str | None:
return state.get("name")
Before — flagged Decoded JSON still needs validation
app/state.py
import json
def name(text: str):
state = json.loads(text)
return state.get("name")
After — preferred Validate JSON before reading its fields
app/state.py
from pydantic import BaseModel
class State(BaseModel):
name: str
def name(text: str) -> str:
return State.model_validate_json(text).name