aboutsummaryrefslogtreecommitdiff
path: root/py/objfloat.c
diff options
context:
space:
mode:
authorNicko van Someren <nicko@nicko.org>2019-12-31 15:19:12 -0700
committerDamien George <damien.p.george@gmail.com>2020-01-30 14:53:07 +1100
commit3aab54bf434e7f025a91ea05052f1bac439fad8c (patch)
tree838593685c39f9ee39dd0556715e4a1fc7038e93 /py/objfloat.c
parentc3450effd4c3a402eeccf44a84a05ef4b36d69a0 (diff)
py: Support non-boolean results for equality and inequality tests.
This commit implements a more complete replication of CPython's behaviour for equality and inequality testing of objects. This addresses the issues discussed in #5382 and a few other inconsistencies. Improvements over the old code include: - Support for returning non-boolean results from comparisons (as used by numpy and others). - Support for non-reflexive equality tests. - Preferential use of __ne__ methods and MP_BINARY_OP_NOT_EQUAL binary operators for inequality tests, when available. - Fallback to op2 == op1 or op2 != op1 when op1 does not implement the (in)equality operators. The scheme here makes use of a new flag, MP_TYPE_FLAG_NEEDS_FULL_EQ_TEST, in the flags word of mp_obj_type_t to indicate if various shortcuts can or cannot be used when performing equality and inequality tests. Currently four built-in classes have the flag set: float and complex are non-reflexive (since nan != nan) while bytearray and frozenszet instances can equal other builtin class instances (bytes and set respectively). The flag is also set for any new class defined by the user. This commit also includes a more comprehensive set of tests for the behaviour of (in)equality operators implemented in special methods.
Diffstat (limited to 'py/objfloat.c')
-rw-r--r--py/objfloat.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/py/objfloat.c b/py/objfloat.c
index 3da549bb2..6181d5f57 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -186,6 +186,7 @@ STATIC mp_obj_t float_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs
const mp_obj_type_t mp_type_float = {
{ &mp_type_type },
.name = MP_QSTR_float,
+ .flags = MP_TYPE_FLAG_NEEDS_FULL_EQ_TEST,
.print = float_print,
.make_new = float_make_new,
.unary_op = float_unary_op,