1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Refs #29838 -- Fixed make_hashable() for values that have lists or dicts nested in tuples.

And for non-hashable values that are iterable, e.g. sets.
This commit is contained in:
aspalding
2018-10-16 10:02:36 -05:00
committed by Tim Graham
parent 834c4ec8e4
commit 217f82d713
2 changed files with 23 additions and 3 deletions

View File

@@ -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