fix: make Delorean hashable by defining __hash__

Defining __eq__ without __hash__ sets __hash__ to None in Python 3, so
Delorean instances were unhashable and could not be used in sets or as
dict keys (unlike datetime). Hash on self.epoch, the same value __eq__
compares, so equal instances hash equal.
This commit is contained in:
dualfroz committed 2026-09-04 09:39:40 +02:00
1 parent c8e576472e
commit 518ab0a093
3 files changed
+87

No files matched your search

+15
View File
@@ -50,6 +50,21 @@ class DeloreanTests(unittest.TestCase):
dt = date(2013, 5, 6)
self.assertRaises(ValueError, delorean.Delorean, dt)
def test_hashable(self):
# Delorean defines __eq__, so it must define __hash__ too, otherwise
# Python 3 makes instances unhashable and unusable in sets/dict keys.
self.assertEqual(hash(self.do), hash(self.do))
self.assertIn(self.do, {self.do})
mapping = {self.do: "value"}
self.assertEqual(mapping[self.do], "value")
def test_hash_consistent_with_equality(self):
# Equal objects (same instant, different timezone) must hash equal.
other = self.do.shift("US/Pacific")
self.assertEqual(self.do, other)
self.assertEqual(hash(self.do), hash(other))
self.assertEqual(len({self.do, other}), 1)
def test_initialize_from_datetime_naive(self):
self.assertRaises(
delorean.DeloreanInvalidTimezone, delorean.Delorean, datetime=self.naive_dt