I am trying to understand the underlying mechanics behind hash(itertools.count(x, y))
.
I am not used to looking deeply into CPython implementations, but I noticed that in itertoolsmodule.c
the static PyTypeObject count_type
has 0
for tp_hash
.
I am assuming that this means that it does not implement hash
in C. So, how does it get taken care of? Is there a Python object for the C binding itertools.count
that implements __hash__
?
On another note, what happens behind the scene such that
itertools.count(0, 5) != itertools.count(0, 5)
Advertisement
Answer
It just inherits the default identity-based __hash__
and __eq__
from object
.
Quoting the docs for tp_hash
:
Inheritance:
Group: tp_hash, tp_richcompare
This field is inherited by subtypes together with tp_richcompare: a subtype inherits both of tp_richcompare and tp_hash, when the subtype’s tp_richcompare and tp_hash are both NULL.
Since tp_hash
and tp_richcompare
are both statically initialized to 0
, PyType_Ready
will copy those fields from the base class, which defaults to object
.