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>
x.__args__ = [str, int]
(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):
x = int | str
self.assertIsInstance(1, x)
--- /dev/null
+Fix the hash of the union type: it no longer depends on the order of
+arguments.
union_hash(PyObject *self)
{
unionobject *alias = (unionobject *)self;
- Py_hash_t h1 = PyObject_Hash(alias->args);
- if (h1 == -1) {
- return -1;
+ PyObject *args = PyFrozenSet_New(alias->args);
+ if (args == NULL) {
+ return (Py_hash_t)-1;
}
- return h1;
+ Py_hash_t hash = PyObject_Hash(args);
+ Py_DECREF(args);
+ return hash;
}
static int