Kaydet (Commit) 6e8fef07 authored tarafından Nick Coghlan's avatar Nick Coghlan

Issue 2235: document PyObject_HashNotImplemented

üst f70385a5
...@@ -269,6 +269,16 @@ is considered sufficient for this determination. ...@@ -269,6 +269,16 @@ is considered sufficient for this determination.
This is the equivalent of the Python expression ``hash(o)``. 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) .. cfunction:: int PyObject_IsTrue(PyObject *o)
Returns ``1`` if the object *o* is considered to be true, and ``0`` otherwise. Returns ``1`` if the object *o* is considered to be true, and ``0`` otherwise.
......
...@@ -324,6 +324,14 @@ type objects) *must* have the :attr:`ob_size` field. ...@@ -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 error occurs during the computation of the hash value, the function should set
an exception and return ``-1``. 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` 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 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. the object's address is returned; otherwise, a :exc:`TypeError` is raised.
......
...@@ -166,6 +166,9 @@ Build ...@@ -166,6 +166,9 @@ Build
Documentation Documentation
------------- -------------
- Issue #2235: the C API function PyObject_HashNotImplemented and its
interaction with the tp_hash slot (added in 2.6b2) are now documented
- Issue #643841: The language reference now provides more detailed - Issue #643841: The language reference now provides more detailed
coverage of the lookup process for special methods. The disclaimers coverage of the lookup process for special methods. The disclaimers
regarding lack of coverage of new-style classes have also been regarding lack of coverage of new-style classes have also been
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment