summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
Diffstat (limited to 'django/utils')
-rw-r--r--django/utils/hashable.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/django/utils/hashable.py b/django/utils/hashable.py
index 859ea8073e..0bef5b003d 100644
--- a/django/utils/hashable.py
+++ b/django/utils/hashable.py
@@ -1,9 +1,19 @@
+from django.utils.itercompat import is_iterable
+
+
def make_hashable(value):
- if isinstance(value, list):
- return tuple(map(make_hashable, value))
if isinstance(value, dict):
return tuple([
(key, make_hashable(nested_value))
for key, nested_value in value.items()
])
+ # Try hash to avoid converting a hashable iterable (e.g. string, frozenset)
+ # to a tuple.
+ try:
+ hash(value)
+ except TypeError:
+ if is_iterable(value):
+ return tuple(map(make_hashable, value))
+ # Non-hashable, non-iterable.
+ raise
return value