bpo-44646: Fix the hash of the union type. (#27179)
It no longer depends on the order of arguments. hash(int | str) == hash(str | int) Co-authored-by: Jack DeVries <58614260+jdevries3133@users.noreply.github.com>
This commit is contained in:
parent
919ad53751
commit
aeaa553d65
@ -663,6 +663,10 @@ class TypesTests(unittest.TestCase):
|
|||||||
x.__args__ = [str, int]
|
x.__args__ = [str, int]
|
||||||
(int | str ) == x
|
(int | str ) == x
|
||||||
|
|
||||||
|
def test_hash(self):
|
||||||
|
self.assertEqual(hash(int | str), hash(str | int))
|
||||||
|
self.assertEqual(hash(int | str), hash(typing.Union[int, str]))
|
||||||
|
|
||||||
def test_instancecheck(self):
|
def test_instancecheck(self):
|
||||||
x = int | str
|
x = int | str
|
||||||
self.assertIsInstance(1, x)
|
self.assertIsInstance(1, x)
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Fix the hash of the union type: it no longer depends on the order of
|
||||||
|
arguments.
|
@ -36,11 +36,13 @@ static Py_hash_t
|
|||||||
union_hash(PyObject *self)
|
union_hash(PyObject *self)
|
||||||
{
|
{
|
||||||
unionobject *alias = (unionobject *)self;
|
unionobject *alias = (unionobject *)self;
|
||||||
Py_hash_t h1 = PyObject_Hash(alias->args);
|
PyObject *args = PyFrozenSet_New(alias->args);
|
||||||
if (h1 == -1) {
|
if (args == NULL) {
|
||||||
return -1;
|
return (Py_hash_t)-1;
|
||||||
}
|
}
|
||||||
return h1;
|
Py_hash_t hash = PyObject_Hash(args);
|
||||||
|
Py_DECREF(args);
|
||||||
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user