On 05/07/2020 10:09, Federico Salerno wrote:
On the topic of NaNs: I think in the face of ambiguity, we should
refuse the temptation to guess and raise ValueError when the values
given are not comparable to the point of clearly determining whether
`value` is or isn't within `minimum` and `maximum` or which of the two
bounds it exceeds. It is the programmer's responsibility to ensure
they supply arguments that make sense, and non-numbers should be
considered exceptional behaviour: as such, the programmer that
anticipates those kinds of values should handle them exceptionally.
About the name: clamp seems to be the most favoured name and the
discussion convinced me it's the one that should make it to the
eventual proposal.
About the stdlib/builtin status: `min(max(x, min_), max_)` is a common
enough idiom for a simple enough function that I think it is
definitely beneficial and in no way dangerous to have, and that any
status other than builtin would incur too much overhead for something
so small. I risk claiming that most calls to max() and min() occur in
modules that do not `import math` (or at the very least, they occur
often enough without `import math`), and I believe clamp(), being very
similar in scope to those, should benefit from similar status.
I don't think clamp is a common enough identifier in non-specific
fields to disqualify its implementation as a builtin by itself. By
contrast, terms like `min` and `max` are extremely common in pretty
much all contexts, and yet we've all survived just fine by typing
`min_` and `max_` or even shadowing the names altogether (which I
prefer not to do, but is definitely an option).
+1 to all of the above (I don't feel strongly about the name). All
seems very sensible.
FInally, I'd like to lit another fire: given that `min()` and `max()`
accept an arbitrary amount of arguments, and that the signature that
seems to be preferred for the hypothetical clamp at the moment sees
`value` as the first positional argument, should the function then
accept iterables as values for `minimum` and `maximum`?
Something along the lines of:
clamp(value: Number, minimum: Union[Number, Iterable[Number]], maximum:
Union[Number, Iterable[Number]])
-1. As others have said, this is over-egging it.
I think None should be allowed as a missing bound.
I don't think the new function should be restricted to numbers. There
may be uses for strings, or for user-built classes; why restrict it
unnecessarily?
If it quacks like supporting __lt__ and __gt__, it's a duck.
Rob Cliffe
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/python-ideas@python.org/message/YUOCR36ZBUGUDTHJ3HDBIEYFSUVHCXX7/
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/python-ideas@python.org/message/2WWV33TF5C5H7HXU7ETMTIOIWM3NU75P/
Code of Conduct: http://python.org/psf/codeofconduct/