New submission from Nick Coghlan:

This is an idea that would require a PEP, just writing it down here as a 
permanent record in case someone else wants to run with it.

Currently, the *simplest* way to define a non-identity total ordering on an 
immutable object is to define __hash__, __eq__ and __lt__ appropriately, and 
then use functools.total_ordering to add the other comparison methods.

However, many such implementations follow a very similar pattern:

    def __hash__(self):
        return hash(self._calculate_key())
    def __eq__(self, other):
        if isinstance(other, __class__):
            return self._calculate_key() == other._calculate_key()
        return NotImplemented
    def __lt__(self, other):
        if isinstance(other, __class__):
            return self._calculate_key() < other._calculate_key()
        return NotImplemented

A "__key__" protocol as an inherent part of the type system could greatly 
simplify that:

    def __key__(self):
        return self._calculate_key()

The interpreter would then derive appropriate implementations for __hash__ and 
all the rich comparison methods based on that key calculation and install them 
when the type object was created.

If the type is mutable (and hence orderable but not hashable), then setting 
"__hash__ = None" would disable the implicit hashing support (just as it can 
already be used to explicitly disable hash inheritance).

(Inspired by Chris Withers's python-dev thread: 
https://mail.python.org/pipermail/python-dev/2014-February/132332.html)

----------
components: Interpreter Core
messages: 211253
nosy: ncoghlan
priority: normal
severity: normal
status: open
title: Define a new __key__ protocol
type: enhancement
versions: Python 3.5

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue20632>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to