from dataclasses import dataclass


@dataclass
class Reading:
    timestamp: float
    altitude: float
    status: str = "nominal"

    def __post_init__(self):
        if self.altitude < 0:
            raise ValueError(f"altitude must be non-negative, got {self.altitude}")

    def is_nominal(self) -> bool:
        return self.status == "nominal"


readings: list[Reading] = [
    Reading(0.0, 400.0),
    Reading(1.0, 405.0, "warning"),
    Reading(2.0, 410.0),
    Reading(3.0, 300.0, "critical"),
]

problems = [r for r in readings if not r.is_nominal()]
for r in problems:
    print(r)

mean_altitude = sum(r.altitude for r in readings) / len(readings)
print(f"Mean altitude: {mean_altitude:.1f} m")

try:
    Reading(4.0, -10.0)
except ValueError as err:
    print(f"Rejected: {err}")

Reading(timestamp=1.0, altitude=405.0, status='warning')
Reading(timestamp=3.0, altitude=300.0, status='critical')
Mean altitude: 378.8 m
Rejected: altitude must be non-negative, got -10.0