Improved behavior of comparison between quantities#249
Improved behavior of comparison between quantities#249wagenadl wants to merge 3 commits intopython-quantities:masterfrom
Conversation
For quantities A and B of unequal dimensionality, the `==` operator
now returns an array of the same shape that numpy would return
if A and B were different and filled with False.
In particular, if both A and B are scalar arrays, the result is
a scalar False. Previously, a scalar array (`np.array(False)`)
would be returned under these circumstances.
If A and B do not have compatible sizes, an exception is generated.
The `!=` operator behaves the same except that it fills the result
with True values.
The other comparison operators now raise exceptions if a quantity
that is not dimensionless is compared to a plain number. For
effectively dimensionless quantities the comparison is now
consistent. Previously, if
n = pq.s * pq.kHz,
then n < 2 would return True but n.simplified < 2 would return
False. Now, both return False.
Comparison between incompatible quantities raises exceptions as
before.
Typo caused __gt__ to behave like __ge__. No more.
|
Implementation detail: To keep things simple, I have reimplemented Quantity's |
|
Thank you for this, the new behaviour as you describe it does seem to be an improvement. There is, however, a risk that it breaks downstream code that relies on the current behaviour, so I would like to test it first with some of the downstream projects, such as Neo. I note that this would require #248 to be merged first. @wagenadl perhaps you could modify the implementation, at least temporarily, to not use the In addition, please could you add some unit tests, for the "standard" usage, and for any potential corner cases you can foresee? |
The "test_comparison.py" test file now verifies that the behavior of the comparison operators matches the new specification. This involved changing various assertions and adding some new ones. Also, this patch now also works without the new “dimensionless_magnitude” property.
|
I agree that this patch may break some extant code. It is, of course, not up to me to decide whether that is an acceptable cost for the improvement. To reiterate why I think the new behavior is preferable: Both versions of the code agree that In my latest commit, the "test_comparison.py" test file now verifies that the behavior of the comparison operators matches the new specification. This involved changing various assertions and adding some new ones. Also, this patch now also works independently of the recently merged “dimensionless_magnitude” property. |
For quantities A and B of unequal dimensionality, the
==operator now returns an array of the same shape that numpy would return if A and B were different and filled with False.In particular, if both A and B are scalar arrays, the result is a scalar False. Previously, a scalar array (
np.array(False)) would be returned under these circumstances.If A and B do not have compatible sizes, an exception is generated.
The
!=operator behaves the same except that it fills the result with True values.The other comparison operators now raise exceptions if a quantity that is not dimensionless is compared to a plain number. For effectively dimensionless quantities the comparison is now consistent. Previously, if
then
n < 2would return True butn.simplified < 2would return False. Now, both return False.Comparison between incompatible quantities raises exceptions as before.
Closes #245