Я не уверен, что именно вы ищете.Но используя данные вашего примера:
>>> a = ((1, 2), (3, 4))
>>> b = ((1, 2), [3, 4])
>>> isinstance(a, collections.Hashable)
True
>>> isinstance(b, collections.Hashable)
True
Следовательно, действительно, использование collections.Hashable
- не лучший способ.Тем не менее,
>>> hash(a)
5879964472677921951
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Таким образом, по крайней мере для данных примера достаточно использовать hash
, чтобы проверить, является ли объект хэшируемым.Конечно, как вы уже указали в своем вопросе, если __hash__
неправильно реализован для подкласса, скажем, list
, то эта проверка не будет работать.