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.
Victor
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/files line 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
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/