diff --git a/pyrsistent/_pmap.py b/pyrsistent/_pmap.py index e68762e..0d82c43 100644 --- a/pyrsistent/_pmap.py +++ b/pyrsistent/_pmap.py @@ -413,7 +413,8 @@ def set(self, key, val): for k, v in bucket: if k == key: if v is not val: - new_bucket = [(k2, v2) if k2 != k else (k2, val) for k2, v2 in bucket] + # Use `not (k2 == k)` rather than `!=` to avoid relying on a well implemented `__ne__`, see #268. + new_bucket = [(k2, v2) if not (k2 == k) else (k2, val) for k2, v2 in bucket] self._buckets_evolver[index] = new_bucket return self @@ -476,7 +477,8 @@ def remove(self, key): index, bucket = PMap._get_bucket(self._buckets_evolver, key) if bucket: - new_bucket = [(k, v) for (k, v) in bucket if k != key] + # Use `not (k == key)` rather than `!=` to avoid relying on a well implemented `__ne__`, see #268. + new_bucket = [(k, v) for (k, v) in bucket if not (k == key)] size_diff = len(bucket) - len(new_bucket) if size_diff > 0: self._buckets_evolver[index] = new_bucket if new_bucket else None diff --git a/tests/map_test.py b/tests/map_test.py index 543867b..ae2317b 100644 --- a/tests/map_test.py +++ b/tests/map_test.py @@ -547,5 +547,5 @@ def test_pmap_removal_with_broken_classes_deriving_from_namedtuple(): # Both items are removed due to how they are compared for inequality assert BrokenPerson('X') not in s - assert BrokenItem('X') not in s - assert len(s) == 0 + assert BrokenItem('X') in s + assert len(s) == 1