list の hash

なるほど。同値関係を定義できるのに、同一オブジェクトじゃないと同一ハッシュにならないという状況はいろいろまずそうだから、それを回避するわけだ。

しかし、新スタイルクラスではobjectに__hash__が定義されているので必ず__hash__を持つので、Cのソース中のTypeErrorは起こらないと思う。その代わり、list自体は__hash__でTypeErrorを投げるように実装されているのではないだろうか。

Objects/listobject.c を見てみた。

static long
list_nohash(PyObject *self)
{
        PyErr_SetString(PyExc_TypeError, "list objects are unhashable");
        return -1;
}
PyTypeObject PyList_Type = {
       PyObject_HEAD_INIT(&PyType_Type)
       /* (snip) */
       list_nohash,                            /* tp_hash */
       /* (snip) */
};

list の __hash__ が TypeError を投げるで間違いなさげ。