Opened 8 years ago
Last modified 22 months ago
#16537 closed enhancement
Python 3 preparation: Use "rich comparison" - std function cmp() is gone, method __cmp__ is ignored — at Initial Version
Reported by: | wluebbe | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | sage-duplicate/invalid/wontfix |
Component: | python3 | Keywords: | python3, richcmp |
Cc: | jpflori | Merged in: | |
Authors: | Reviewers: | ||
Report Upstream: | N/A | Work issues: | |
Branch: | Commit: | ||
Dependencies: | Stopgaps: |
Description
Since Py2.1 there are the rich comparison special methods (__eq__, __ne__, __lt__, __le__, __gt__, __ge__
) to implement comparison operators (==, !=, <, <=, >, >=
respectively) for custom classes.
This is more flexible (but somewhat more tedious) than defining the special method __cmp__
.
In Py3 the special method __cmp__
is ignored. The standard function cmp()
(which is mostly used to implement __cmp__
methods) is gone.
One may define a replacement function like
def cmp(a, b): return (a > b) - (a < b)
But this does not improved performance. And it does not seem forward looking ...
Unfortunately __cmp__
and cmp()
are used a LOT in Sage. And the migration to rich comparison can not be done purely mechanical :-(
Since Py2.7 there is a class decorator functools.total_ordering to help to create the full set of special method __lt__, __le__, __gt__, __ge__
when given one of those.
See Lennart Regebro's Chapter: Use rich comparison operators for a more detailed discussion.
This ticket is tracked as a dependency of meta-ticket ticket:15980.