When I really need such function, I define it like this:
def clamp(min_val, value, max_val): return min(max(min_val, value), max_val)
Test: min_val <= result <= max_val.
The parameter order is chosen to get something looking like min_val <= value (result in fact) <= max_val.
If you need special handling of NaN, I suggest to add a special version in the math module.
I'm not sure that it's worth it to add such new function to the standard library.
It's common to want to clip (or clamp) a number to a range. This feature is commonly needed for both floating point numbers and integers:There are a few approaches:* use a couple ternary operators (e.g. https://github.com/
scipy/scipy/pull/5944/filesline 98, which generated a lot of discussion)* use a min/max construction,* call sorted on a list of the three numbers and pick out the first, or* use numpy.clip.Am I right that there is no *obvious* way to do this? If so, I suggest adding math.clip (or math.clamp) to the standard library that has the meaning:def clip(number, lower, upper):return lower if number < lower else upper if number > upper else numberThis would work for non-numeric types so long as the non-numeric types support comparison. It might also be worth addingassert lower < upperto catch some bugs.Best,Neil
Python-ideas mailing list
Code of Conduct: http://python.org/psf/