summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2008-08-18 13:14:22 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2008-08-18 13:14:22 (GMT)
commit6e8fef07e5d1a3372d0c729c81dd383a23b053d5 (patch)
treecd7efd8b360e34c582e96cd5e05e1f9bf555dd21 /Doc
parentf70385a5c3245a9cac9c0546c65bd467a2ac5249 (diff)
downloadcpython-6e8fef07e5d1a3372d0c729c81dd383a23b053d5.zip
cpython-6e8fef07e5d1a3372d0c729c81dd383a23b053d5.tar.gz
cpython-6e8fef07e5d1a3372d0c729c81dd383a23b053d5.tar.bz2
Issue 2235: document PyObject_HashNotImplemented
Diffstat (limited to 'Doc')
-rw-r--r--Doc/c-api/object.rst10
-rw-r--r--Doc/c-api/typeobj.rst8
2 files changed, 18 insertions, 0 deletions
diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst
index 7bb845a..883d095 100644
--- a/Doc/c-api/object.rst
+++ b/Doc/c-api/object.rst
@@ -269,6 +269,16 @@ is considered sufficient for this determination.
This is the equivalent of the Python expression ``hash(o)``.
+.. cfunction:: long PyObject_HashNotImplemented(PyObject *o)
+
+ Set a TypeError indicating that ``type(o)`` is not hashable and return ``-1``.
+ This function receives special treatment when stored in a ``tp_hash`` slot,
+ allowing a type to explicit indicate to the interpreter that it is not
+ hashable.
+
+ .. versionadded:: 2.6
+
+
.. cfunction:: int PyObject_IsTrue(PyObject *o)
Returns ``1`` if the object *o* is considered to be true, and ``0`` otherwise.
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index 1807c92..463223a 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -324,6 +324,14 @@ type objects) *must* have the :attr:`ob_size` field.
error occurs during the computation of the hash value, the function should set
an exception and return ``-1``.
+ This field can be set explicitly to :cfunc:`PyObject_HashNotImplemented` to
+ block inheritance of the hash method from a parent type. This is interpreted
+ as the equivalent of ``__hash__ = None`` at the Python level, causing
+ ``isinstance(o, collections.Hashable)`` to correctly return ``False``. Note
+ that the converse is also true - setting ``__hash__ = None`` on a class at
+ the Python level will result in the ``tp_hash`` slot being set to
+ :cfunc:`PyObject_HashNotImplemented`.
+
When this field is not set, two possibilities exist: if the :attr:`tp_compare`
and :attr:`tp_richcompare` fields are both *NULL*, a default hash value based on
the object's address is returned; otherwise, a :exc:`TypeError` is raised.