mirror of https://github.com/python/cpython.git
[3.10] bpo-44636: Collapse union of equal types (GH-27178) (GH-27181)
The result of `int | int` is now `int`.
Fix comparison of the union type with non-hashable objects.
`int | str == {}` no longer raises a TypeError.
(cherry picked from commit d9f923280f
)
This commit is contained in:
parent
37686f78cc
commit
c3007ab3c6
|
@ -623,7 +623,7 @@ def test_or_types_operator(self):
|
||||||
self.assertEqual(None | typing.List[int], typing.Union[None, typing.List[int]])
|
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(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(typing.Union[str, int, typing.List[int]], str | int | typing.List[int])
|
||||||
self.assertEqual(int | int, int)
|
self.assertIs(int | int, int)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
BaseException |
|
BaseException |
|
||||||
bool |
|
bool |
|
||||||
|
@ -651,6 +651,8 @@ def test_or_types_operator(self):
|
||||||
3 | int
|
3 | int
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
Example() | int
|
Example() | int
|
||||||
|
x = int | str
|
||||||
|
self.assertNotEqual(x, {})
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
(int | str) < typing.Union[str, int]
|
(int | str) < typing.Union[str, int]
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
|
|
|
@ -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.
|
|
@ -184,9 +184,9 @@ union_richcompare(PyObject *a, PyObject *b, int op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (PySet_Add(b_set, b) == -1) {
|
Py_DECREF(a_set);
|
||||||
goto exit;
|
Py_DECREF(b_set);
|
||||||
}
|
Py_RETURN_NOTIMPLEMENTED;
|
||||||
}
|
}
|
||||||
result = PyObject_RichCompare(a_set, b_set, op);
|
result = PyObject_RichCompare(a_set, b_set, op);
|
||||||
exit:
|
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);
|
result = PyObject_GC_New(unionobject, &_Py_UnionType);
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
|
Py_DECREF(args);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
result->args = dedup_and_flatten_args(args);
|
result->args = args;
|
||||||
_PyObject_GC_TRACK(result);
|
_PyObject_GC_TRACK(result);
|
||||||
if (result->args == NULL) {
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return (PyObject*)result;
|
return (PyObject*)result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue