15 lines
450 B
Python
15 lines
450 B
Python
"""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
|