"""Clamp a value to [lo, hi]. Handles None by raising, preserves type.""" from __future__ import annotations def clamp(value, lo, hi): if value is None or lo is None or hi is None: raise ValueError("None is not a clampable value: value=%r, lo=%r, hi=%r" % (value, lo, hi)) if lo > hi: raise ValueError("lo > hi: %r > %r" % (lo, hi)) if value < lo: return lo if value > hi: return hi return value