fromdjango.utils.itercompatimportis_iterabledefmake_hashable(value):""" Attempt to make value hashable or raise a TypeError if it fails. The returned value should generate the same hash for equal values. """ifisinstance(value,dict):returntuple([(key,make_hashable(nested_value))forkey,nested_valueinsorted(value.items())])# Try hash to avoid converting a hashable iterable (e.g. string, frozenset)# to a tuple.try:hash(value)exceptTypeError:ifis_iterable(value):returntuple(map(make_hashable,value))# Non-hashable, non-iterable.raisereturnvalue