summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_types.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst1
-rw-r--r--Objects/unionobject.c24
3 files changed, 20 insertions, 9 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index bb50412..8db9880 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -623,7 +623,7 @@ class TypesTests(unittest.TestCase):
self.assertEqual(None | typing.List[int], typing.Union[None, typing.List[int]])
self.assertEqual(str | float | int | complex | int, (int | str) | (float | complex))
self.assertEqual(typing.Union[str, int, typing.List[int]], str | int | typing.List[int])
- self.assertEqual(int | int, int)
+ self.assertIs(int | int, int)
self.assertEqual(
BaseException |
bool |
@@ -651,6 +651,8 @@ class TypesTests(unittest.TestCase):
3 | int
with self.assertRaises(TypeError):
Example() | int
+ x = int | str
+ self.assertNotEqual(x, {})
with self.assertRaises(TypeError):
(int | str) < typing.Union[str, int]
with self.assertRaises(TypeError):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst
new file mode 100644
index 0000000..1a053ae
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst
@@ -0,0 +1 @@
+Collapse union of equal types. E.g. the result of ``int | int`` is now ``int``. Fix comparison of the union type with non-hashable objects. E.g. ``int | str == {}`` no longer raises a TypeError.
diff --git a/Objects/unionobject.c b/Objects/unionobject.c
index 762df5d..f3e0aa6 100644
--- a/Objects/unionobject.c
+++ b/Objects/unionobject.c
@@ -184,9 +184,9 @@ union_richcompare(PyObject *a, PyObject *b, int op)
}
}
} else {
- if (PySet_Add(b_set, b) == -1) {
- goto exit;
- }
+ Py_DECREF(a_set);
+ Py_DECREF(b_set);
+ Py_RETURN_NOTIMPLEMENTED;
}
result = PyObject_RichCompare(a_set, b_set, op);
exit:
@@ -499,16 +499,24 @@ _Py_Union(PyObject *args)
}
}
+ args = dedup_and_flatten_args(args);
+ if (args == NULL) {
+ return NULL;
+ }
+ if (PyTuple_GET_SIZE(args) == 1) {
+ PyObject *result1 = PyTuple_GET_ITEM(args, 0);
+ Py_INCREF(result1);
+ Py_DECREF(args);
+ return result1;
+ }
+
result = PyObject_GC_New(unionobject, &_Py_UnionType);
if (result == NULL) {
+ Py_DECREF(args);
return NULL;
}
- result->args = dedup_and_flatten_args(args);
+ result->args = args;
_PyObject_GC_TRACK(result);
- if (result->args == NULL) {
- Py_DECREF(result);
- return NULL;
- }
return (PyObject*)result;
}