From 44aa9483a4fe52850654c0e65a422e5e0e635529 Mon Sep 17 00:00:00 2001 From: spametki Date: Wed, 4 Sep 2013 16:19:59 -0300 Subject: [PATCH] Cast keys recursively including iterables (issue 1639 syntax error) --- gluon/serializers.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/gluon/serializers.py b/gluon/serializers.py index 4b92e47b..cf31fd0b 100644 --- a/gluon/serializers.py +++ b/gluon/serializers.py @@ -47,20 +47,23 @@ def cast_keys(o, cast=str, encoding="utf-8"): newobj = dict() else: newobj = Storage() - for k, v in o.items(): if (cast == str) and isinstance(k, unicode): key = k.encode(encoding) else: key = cast(k) - if isinstance(v, (dict, Storage)): - value = cast_keys(v, cast=cast, encoding=encoding) - else: - value = v - newobj[key] = value + newobj[key] = cast_keys(v, cast=cast, encoding=encoding) + elif isinstance(o, (tuple, set, list)): + newobj = [] + for item in o: + newobj.append(cast_keys(item, cast=cast, encoding=encoding)) + if isinstance(o, tuple): + newobj = tuple(newobj) + elif isinstance(o, set): + newobj = set(newobj) else: - raise TypeError("Cannot cast keys: %s is not supported" % \ - type(o)) + # no string cast (unknown object) + newobj = o return newobj def loads_json(o, unicode_keys=True, **kwargs):