__hash__
http://d.hatena.ne.jp/morchin/20071130/p1
を読んで。
object.cから転載
long PyObject_Hash(PyObject *v) { PyTypeObject *tp = v->ob_type; if (tp->tp_hash != NULL) return (*tp->tp_hash)(v); if (tp->tp_compare == NULL && RICHCOMPARE(tp) == NULL) { return _Py_HashPointer(v); /* Use address as hash value */ } /* If there's a cmp but no hash defined, the object can't be hashed */ PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'", v->ob_type->tp_name); return -1; }
うーん、何となくはわかるけど、なんで「tp->tp_compare == NULL && RICHCOMPARE(tp) == NULL」って条件が必要なのかがわからない。tp_hashを持っているならそれでハッシュ値を計算して、持ってないならポインタの値から計算する、でいいのに。挙動から推測すると「tp->tp_compare == NULL && RICHCOMPARE(tp) == NULL」でリストが弾かれるはずなんだけどもなー。
明日朝起きないと行けないのでもうねる。