summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/objtype.c1
-rw-r--r--tests/basics/class_contains.py24
2 files changed, 25 insertions, 0 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 0977a67ce..e320adc8b 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -549,6 +549,7 @@ retry:;
} else if (dest[0] != MP_OBJ_NULL) {
dest[2] = rhs_in;
res = mp_call_method_n_kw(1, 0, dest);
+ res = op == MP_BINARY_OP_CONTAINS ? mp_obj_new_bool(mp_obj_is_true(res)) : res;
} else {
// If this was an inplace method, fallback to normal method
// https://docs.python.org/3/reference/datamodel.html#object.__iadd__ :
diff --git a/tests/basics/class_contains.py b/tests/basics/class_contains.py
index b6dd3661c..5fdb1db4c 100644
--- a/tests/basics/class_contains.py
+++ b/tests/basics/class_contains.py
@@ -21,3 +21,27 @@ b = B([1, 2])
print(1 in b)
print(2 in b)
print(3 in b)
+
+
+class C:
+ def __contains__(self, arg):
+ return arg
+
+
+print(C().__contains__(0))
+print(C().__contains__(1))
+print(C().__contains__(''))
+print(C().__contains__('foo'))
+print(C().__contains__(None))
+
+print(0 in C())
+print(1 in C())
+print('' in C())
+print('foo' in C())
+print(None in C())
+
+print(0 not in C())
+print(1 not in C())
+print('' not in C())
+print('foo' not in C())
+print(None not in C())