summaryrefslogtreecommitdiff
path: root/alot
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2016-12-22 15:06:13 -0800
committerDylan Baker <dylan@pnwbakers.com>2016-12-27 15:10:58 -0800
commitf64b487b89085f8553e8875ce54c1783c618ee9d (patch)
tree6406f681f9a48143d8890c37ecf5b8db24a0e7f0 /alot
parentdebb4e61dafae81078520a019e8d4c75807cf8fd (diff)
db/message: replace __cmp__ with rich comparisons
This replaces the deprecated __cmp__ function with the more modern __lt__, __eq__, and __ne__, and then uses functools.total_ordering to implemented the remaining pieces of the rich comparison protocol automatically. It also make use of the NotImplemented singleton, which python uses to signal to rich comparators that this class doesn't no how to compare to the other class, which results in the complementary method from the other class being used, and if both return NotImplemented than a TypeError is generated. There are two reasons to make this change. First, python 3 only supports rich comparisons, and second rich comparisons are much faster than using cmp (and the __cmp__ protocol) because cmp is called at least 3 times per element, while a rich comparitor is called one per element. functools.total_ordering is in the standard library from 2.7 and 3.3, and will implement the rich comparison protocol provided that __eq__ and at least one of __lt__, __le__, __ge__, or __gt__ are implemented. It does not (oddly enough) implement __ne__, so I've implemented that manually.
Diffstat (limited to 'alot')
-rw-r--r--alot/db/message.py20
1 files changed, 16 insertions, 4 deletions
diff --git a/alot/db/message.py b/alot/db/message.py
index 5566fa64..2f5e61e3 100644
--- a/alot/db/message.py
+++ b/alot/db/message.py
@@ -3,6 +3,7 @@
# For further details see the COPYING file
import email
import email.charset as charset
+import functools
from datetime import datetime
from notmuch import NullPointerError
@@ -16,6 +17,7 @@ from ..settings import settings
charset.add_charset('utf-8', charset.QP, charset.QP, 'utf-8')
+@functools.total_ordering
class Message(object):
"""
@@ -60,10 +62,20 @@ class Message(object):
"""needed for sets of Messages"""
return hash(self._id)
- def __cmp__(self, other):
- """needed for Message comparison"""
- res = cmp(self.get_message_id(), other.get_message_id())
- return res
+ def __eq__(self, other):
+ if isinstance(other, type(self)):
+ return self.get_message_id() == other.get_message_id()
+ return NotImplemented
+
+ def __ne__(self, other):
+ if isinstance(other, type(self)):
+ return self.get_message_id() != other.get_message_id()
+ return NotImplemented
+
+ def __lt__(self, other):
+ if isinstance(other, type(self)):
+ return self.get_message_id() < other.get_message_id()
+ return NotImplemented
def get_email(self):
"""returns :class:`email.Message` for this message"""