summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Fairchild <gfairchild@lanl.gov>2015-06-22 14:54:54 -0600
committerGeoffrey Fairchild <gfairchild@lanl.gov>2015-06-22 14:54:54 -0600
commit010f421e8837a68bff59f1edd3721dbb4d019954 (patch)
tree45430d768ca1d046590eb5c4d3743431889ee750
parent3417bc297e88d701c7e616bd1045e1fd8ed5f959 (diff)
downloadisodate-010f421e8837a68bff59f1edd3721dbb4d019954.tar.gz
Duration objects are now hashable
-rw-r--r--src/isodate/duration.py7
-rw-r--r--src/isodate/tests/test_duration.py17
2 files changed, 24 insertions, 0 deletions
diff --git a/src/isodate/duration.py b/src/isodate/duration.py
index e3283b3..437afe8 100644
--- a/src/isodate/duration.py
+++ b/src/isodate/duration.py
@@ -134,6 +134,13 @@ class Duration(object):
self.tdelta.days, self.tdelta.seconds,
self.tdelta.microseconds, self.years, self.months)
+ def __hash__(self):
+ '''
+ Return a hash of this instance so that it can be used in, for
+ example, dicts and sets.
+ '''
+ return hash((self.tdelta, self.months, self.years))
+
def __neg__(self):
"""
A simple unary minus.
diff --git a/src/isodate/tests/test_duration.py b/src/isodate/tests/test_duration.py
index 6cf6b65..c22d52f 100644
--- a/src/isodate/tests/test_duration.py
+++ b/src/isodate/tests/test_duration.py
@@ -279,6 +279,23 @@ class DurationTest(unittest.TestCase):
self.assertEqual('isodate.duration.Duration(10, 10, 0,'
' years=10, months=10)', repr(dur))
+ def test_hash(self):
+ '''
+ Test __hash__ for Duration objects.
+ '''
+ dur1 = Duration(10, 10, years=10, months=10)
+ dur2 = Duration(9, 9, years=9, months=9)
+ dur3 = Duration(10, 10, years=10, months=10)
+ self.assertNotEqual(hash(dur1), hash(dur2))
+ self.assertNotEqual(id(dur1), id(dur2))
+ self.assertEqual(hash(dur1), hash(dur3))
+ self.assertNotEqual(id(dur1), id(dur3))
+ durSet = set()
+ durSet.add(dur1)
+ durSet.add(dur2)
+ durSet.add(dur3)
+ self.assertEqual(len(durSet), 2)
+
def test_neg(self):
'''
Test __neg__ for Duration objects.